Linux高级命令:渗透测试侦察数据解析实战
学习如何使用高级Linux命令来解析渗透测试侦察数据。
有志于成为网络战士的朋友们!
在本文中,我们将通过实际操作来学习一组经典的Unix文本工具,如awk、sed、uniq、sort以及一些shell单行命令。我们将展示它们如何融入一个真实的侦察工作流程中。为了让示例更加具体,我们将使用LDAP风格的输出(从PowerView.py等工具获得的那种冗长文本),并将其视为渗透测试中经常面临的嘈杂原始数据。我们的目标不是教授每个工具的每个选项,而是给你提供将混乱文本转化为有用情报的模式。我们将获得干净的主机列表、正在使用的操作系统、可达地址以及用于后续扫描的第一批目标。
这里的内容只是你在《黑客高级Linux》培训中会找到的实用练习的一小瞥。把它当作一个友好的邀请吧。
实战示例:LDAP输出
一个非常实用的实验样本是LDAP查询输出。LDAP转储故意设计得很冗长。它们包含许多对象的许多属性。下面你将看到典型LDAP查询的片段。PowerView.py被用来获得这种输出。我们将提取我们需要的部分,并解释为什么这些部分对评估很重要。
LDAP outputLDAP输出很有价值,因为它通常包含主机名属性、操作系统字符串以及用户或服务账户名称。这个单一文件可以告诉你遗留系统在哪里,这对于识别利用机会很有用。你还会发现域控制器、文件服务器或关键基础设施的组成部分。
在测试的早期,你通常会从被攻陷的域机器上ping或解析这些主机名,以了解名称如何在目标网络中映射到IP地址。对域多样性的意识有助于你决定哪些载荷可能有效,哪些会失败。
DNS解析——grep、awk和sed
要处理大量的LDAP列表,我们通常从grep开始以减少噪音。使用带有**-a和-i选项的grep比普通grep是一个小而实用的改进。这里-a将二进制文件视为文本(当文件类型检测模糊时很有用),-i**使搜索不区分大小写,这样你就不会错过大小写变化的属性。
例如:
bash$ > cat DComputers_raw.txt | grep -ai sAMAccountName
using grep to find the right field我们特意选择sAMAccountName而不是Name,是为了向你展示稍后如何使用sed。现在输出越来越接近我们想要的了。让我们用awk删除不必要的文本。保留一个小awk速查表很有用:
awk '{print $1}' file 显示第1列awk '{print $1,$5}' file 显示第1和第5列
一个提取包含主机名字段的典型管道如下:
bash$ > cat DComputers_raw.txt | grep -ai sAMAccountName | awk -F ' ' '{print $3}'
using awk to remove the unnecessary text这里,awk -F ' '将字段分隔符设置为空格,可以替换为其他内容。然后{print $3}告诉awk从每个匹配行打印第三个空格分隔的字段。因此,该管道查找包含sAMAccountName的行,并从这些行中发出第三个标记。
在这一步之后,你可能仍然有尾随字符,如附加到计算机名称的美元符号(结尾)。我们可以用sed删除这些尾随字符。一个小sed速查表:
sed 's/FOO/BAR/g' file 将FOO替换为BARsed 's/FOO//g' file 将FOO替换为空sed '/^FOO/d' file 删除以FOO开头的行
要从每行末尾删除尾随美元符号,我们使用:
bash$ > cat list.txt | sed 's/\$$//g'
using sed to remove unnecessary textsed表达式s/$$//g需要两个美元符号是有原因的。在正则表达式部分**$是正则表达式行尾锚点。一起$同时保留其他字符。我们包含g标志是为了完整性,尽管这个特定模式没有额外效果,因为模式锚定到行尾,但在进行替换时添加g**是一个常见习惯。
在处理域信任时,将域附加到机器名称很重要。否则,名称解析将失败,甚至域控制器也无法ping通计算机。附加机器所属的域可以解决这个问题。我们这样做:
bash$ > sed '/^$/d' computers.txt | sed 's/$/.domain.local/' | awk -F ' ' '{print $3}' > DomainComputers.txt
通过像这样链接grep、awk和sed,你最终会得到干净的计算机名称,可以在后续步骤中使用。
分析——sort、uniq和awk
LDAP转储中常见的另一个属性是operatingSystem。清点操作系统是查找潜在攻击向量的最快方法之一,因为遗留操作系统版本通常具有已知的权限提升漏洞、缺少补丁。sort和uniq的组合非常适合将一长串重复的操作系统字符串转换为紧凑的摘要。
两个有用的uniq选项需要知道:
uniq -u 只打印恰好出现一次的行uniq -d 只打印重复的行
要生成唯一操作系统列表,你可以运行:
bash$ > cat DComputers_raw.txt | grep -ai operatingsystem | awk -F ' ' '{print $3,$4,$5,$6,$7}' | sort | uniq -u
该管道查找包含operatingSystem的行,打印第三到第七个字段(这是捕获多词操作系统描述的实用方法),按字母顺序对结果进行排序,并使用uniq -u仅显示文件中恰好出现一次的操作系统描述。在实践中sort在uniq之前是必不可少的,因为uniq只删除相邻的重复项,而sort将相同的行分组,以便uniq可以找到它们。
如果你想查看常见的操作系统条目(在许多主机上重复的那些),请使用:
bash$ > cat DComputers_raw.txt | grep -ai operatingsystem | awk -F ' ' '{print $3,$4,$5,$6,$7}' | sort | uniq -d
using sort and uniq to sort the output and find common operation systems这仅显示在排序输出中至少有一个重复的操作系统行。它帮助你快速识别通常主导环境的主要系列(例如"Windows 10"或"Windows Server 2019")。
计算出现次数是将其转化为统计数据的另一个步骤。你可以计算有多少主机拥有每个操作系统:
bash$ > cat DComputers_raw.txt | grep -ai operatingsystem | awk -F ' ' '{print $3,$4,$5,$6,$7}' | sort | uniq -dc | sort -n
using sort and uniq to get statistic on operation system use该管道做了三件值得注意的事情:uniq -dc产生计数(-c)并仅打印重复的行(-d)及其出现次数。第一个sort将相同的行分组,使重复项相邻;最后的sort -n按数字对计数输出进行排序(最小的计数在前)。这有助于你确定工作的优先级。如果20台机器使用一个易受攻击的操作系统,那与只有一两台机器使用它是一个不同的问题。
扫描——循环、awk和sed
一旦你有了干净的主机名列表,一个自然的下一步是将它们解析为IP地址并检查基本可达性。主机名对于理解命名约定和网络布局很有用,但有时DNS解析的行为取决于你在网络中的位置或你是否代理流量。从域加入的机器解析然后ping主机可以给出哪些系统响应、哪些离线、隐藏或只是AD中没有活动DNS记录的对象的第一近似值。
需要记住的几个有用的单行命令如下:
for i in $(seq 1 254); do echo 192.168.1.$i; donefor url in $(cat list.txt); do host $url; done
要迭代主机名并ping每个主机,你可以使用如下循环。在第一次运行时,你可能会在原始ping输出中看到DNS解析错误。这是预期的,因为AD DNS名称不能保证从每个有利位置都可解析。将stderr重定向到**/dev/null**会抑制那些错误消息,使循环输出更加干净。
bash$ > for hostname in $(cat pingme.txt); do ping -c 1 $hostname 2>/dev/null | grep ttl; done
creating a bash loop to ping hosts此循环从pingme.txt读取每个主机名,发送单个ICMP回显(-c 1),用2>/dev/null丢弃错误输出,并通过grepping ttl仅保留成功的响应(大多数ping实现在成功回复中包含ttl=)。如果主机名解析失败,你将看不到它的ttl输出。
你还可以从成功的ping回复中仅提取IP地址,并用awk和sed清理格式。下面的示例仅从ping输出打印IP地址:
bash$ > for hostname in $(cat pingme.txt); do ping -c 1 $hostname 2>/dev/null | grep ttl | awk '{print $3}' | sed 's/[():]//g'; done
using grep awk and sed to extract ip addresses from ping that are alive看看这里发生了什么:ping -c 1发送一个探测,然后grep ttl过滤到包含ttl=的回复行,然后awk '{print $3}'打印第三个空格字段,在大多数ping格式中,它包含一个用括号括起来的IP(192.168.1.5)。之后,sed 's/[():]//g'剥离(、)和:字符,因此最终输出是一个纯点分IP,如192.168.1.5。不同的ping实现略有不同,因此你应该在你的系统上测试确切的awk字段编号。
这些IP现在是一个紧凑的目标列表,你可以将其输入到端口扫描器中。Netcat(nc)是一个简单的、可脚本化的选项,通常比完整的端口扫描器更安静,并且如果你需要通过跳转或SOCKS代理到达主机,可以链接到代理工具中。使用代理对SMB(端口445)进行隐秘检查的示例如下:
bash$ > for ip in $(cat ips.txt); do proxychains4 -q nc -zv $ip 445; done
creating a simple bash loop to scan 445 port with proxychains4 thorugh a proxy在此管道中,proxychains4包装nc调用,使TCP连接通过配置的代理,-z告诉nc使用零IO扫描(仅测试可连接性),-v打印连接结果。我们使用**-q**与proxychains来减少其自己的输出冗长。此扫描故意是基本的,这里的重点是展示如何组合简单的构建块。当然,你可以用更高级的工具替换nc,或添加重试、超时和并行性来扩展检查。
总结
我们使用grep查找属性,awk提取字段,sed清理字符串,sort和uniq进行汇总,以及简单的shell循环来解析和探测主机。这些模式并不花哨,但它们是可组合的,并且当你在渗透测试中间时,通常比繁重的GUI或更大的工具迭代更快。
如果你喜欢这篇文章,请点赞关注我